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()
添加回答
举报