1 回答

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()
添加回答
舉報