亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python/Tkinter:使用按鈕控制 for 循環

Python/Tkinter:使用按鈕控制 for 循環

尚方寶劍之說 2022-10-25 15:07:36
我有一個for循環,旨在遍歷列表,在 tkinter 中顯示一些項目,等待按下按鈕,然后存儲一些Entry和Checkbutton數據。下面的代碼是我正在嘗試做的基礎知識的 MRE。在下面的情況下,當Button被擊中時,我想返回loop_function并從button_function.我想也許使用類似lambda: continue或lambda: return可能將其帶回第一個功能的東西,但那些會拋出錯誤。有任何想法嗎?from tkinter import *class TestClass(Frame):    def __init__(self, parent=None):        self.parent = parent        Frame.__init__(self)        self.main = self.master        self.f = Frame(self.parent)        self.f.pack()        (Button(self.f, text='Start',             command = self.loop_function)            .grid(column=0, row=0, padx=10, pady=10))    def loop_function(self):        name_list = ['Luke', 'Han', 'Leia', 'Chewie']        for n in name_list:            self.button_function(n)            force_user = self.fu.get()            side = self.sd.get()            print(n, force_user, side)    def button_function(self, n):        self.fu = IntVar(value=1)        self.sd = StringVar(value='rebel')        self.fu_e = Checkbutton(self.f, variable=self.fu)        self.sd_e = Entry(self.f, textvariable=self.sd)        col = 0        lbl_list = ['Name', 'Force User?', 'Side']        for l in lbl_list:            (Label(self.f, text=l, width=11, anchor=W)                .grid(column=col, row=0, padx=10, pady=10))            col += 1        (Label(self.f, text=n, width=11, anchor=W)            .grid(column=0, row=1, padx=5))        self.fu_e.grid(column=1, row=1)        self.sd_e.grid(column=2, row=1)        (Button(self.f, text='Save',             command = lambda: print('WAIT HERE!!'))            .grid(column=1, row=2, padx=10, pady=10))if __name__ == '__main__':    root=Tk()    ui = TestClass(root)    ui.pack()    root.mainloop()
查看完整描述

1 回答

?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

我認為以下代碼可以完成您想做的事情。單擊按鈕Start后,用戶會看到一個對話框,她可以在其中輸入第一個用戶Luke的屬性。通過單擊按鈕保存輸入的數據以某種方式存儲。然后可以編輯下一個用戶 ( Han )的屬性。


for 循環在這里不是正確的方法。相反,我們想監聽開始和保存按鈕的點擊事件。在我的解決方案中,當用戶單擊Start時,將調用事件處理程序pick_next_player。next此方法總是從我環繞的迭代器中挑選元素name_list。然后 GUI 元素將使用您的button_function.


事件處理程序save_action偵聽保存按鈕的單擊事件。它收集用戶輸入的值,將其存儲到self.results并通過調用顯示下一個玩家pick_next_player。


當最后一個玩家被保存后,這個腳本只會在控制臺打印一行'finished ...'。我假設您要停止腳本或關閉那里的對話框。但這當然取決于你。


from tkinter import *



class TestClass(Frame):

    def __init__(self, parent=None):

        self.parent = parent

        Frame.__init__(self)

        self.main = self.master

        self.f = Frame(self.parent)

        self.f.pack()


        (

            Button(self.f, text='Start', command=self.pick_next_player)

                .grid(column=0, row=0, padx=10, pady=10)

        )


        self.name_list = ['Luke', 'Han', 'Leia', 'Chewie']

        self.name_iter = iter(self.name_list)

        self.results = []

        self.current_name = None


    def pick_next_player(self):

        try:

            self.current_name = next(self.name_iter)

        except StopIteration:

            print(f"finished: {self.results}")

            return


        self.button_function()


    def button_function(self):

        self.fu = IntVar(value=1)

        self.sd = StringVar(value='rebel')


        self.fu_e = Checkbutton(self.f, variable=self.fu)

        self.sd_e = Entry(self.f, textvariable=self.sd)


        col = 0

        lbl_list = ['Name', 'Force User?', 'Side']

        for l in lbl_list:

            (Label(self.f, text=l, width=11, anchor=W)

             .grid(column=col, row=0, padx=10, pady=10))

            col += 1


        (

            Label(self.f, text=self.current_name, width=11, anchor=W)

                .grid(column=0, row=1, padx=5)

        )

        self.fu_e.grid(column=1, row=1)

        self.sd_e.grid(column=2, row=1)

        (

            Button(self.f, text='Save', command=self.save_action)

                .grid(column=1, row=2, padx=10, pady=10)

        )


    def save_action(self):

        force_user = self.fu.get()

        side = self.sd.get()

        print(f"saving {self.current_name}, {force_user}, {side}")

        self.results.append({'name': self.current_name, 'force': force_user, 'faction': side})

        self.pick_next_player()



if __name__ == '__main__':

    root = Tk()

    ui = TestClass(root)

    ui.pack()

    root.mainloop()




查看完整回答
反對 回復 2022-10-25
  • 1 回答
  • 0 關注
  • 273 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號