如何解决保存列表框中选定的项目以供其他类使用
我正在编写部分代码,其行为方式如下:
- 显示项目列表框。
- 用户从列表框中选择一项或多项。
- 用户点击一个单独的按钮小部件以确认选择。
- 一旦用户点击按钮,顶层窗口就会关闭。
- 选择已保存,以便程序的其他部分可以访问它。
我有以下代码(与问题无关的代码被省略):
class MainWin(tk.Tk):
# ... omitted code
def dia(self):
'''
This creates a toplevel window that displays the listbox.
'''
TL = dialogWin(self)
MainWin.wait_window(TL)
class dialogWin(tk.Toplevel):
'''
This window creates and displays the listbox.
'''
def __init__(self,MainWin):
# ... omitted code
# ...
B = tk.Button(self,text = 'Confirm',command = self.getChoices).grid(row = 3) #This is the button that the user clicks to confirm the selection
#create listbox
self.LB = tk.Listbox(self,height = 10,width = 45,selectmode = 'multiple')
# ... code to configure the listbox appearence
def getChoices(self):
'''
This is the callback function the listbox uses.
'''
choice = self.LB.curselection()
self.destroy()
return choice
这是我拥有的代码,但我似乎无法找到实际访问存储在 choice
中的信息的方法。例如,如果我编辑 dia(self)
以确认返回值,如下所示:
def dia(self):
TL = dialogWin(self)
MainWin.wait_window(TL)
print(TL.getChoices())
我收到错误 _tkinter.TclError: invalid command name ".!dialogwin.!listbox"
。 TL.getChoices().get()
给了我同样的错误。我想要的是将所选信息保存为 (1,2,3)
之类的内容,然后我可以从主窗口访问元组。是不是我做错了什么?
解决方法
你们很亲近。窗口被销毁后,您不能再使用 tkinter 小部件方法,但您可以使用自己的方法和属性:
import tkinter as tk
class MainWin(tk.Tk):
def __init__(self):
super().__init__()
tk.Button(self,text='click me',command=self.dia).pack()
self.geometry('200x200')
def dia(self):
TL = dialogWin(self)
MainWin.wait_window(TL)
print(TL.choice)
class dialogWin(tk.Toplevel):
def __init__(self,MainWin):
super().__init__(MainWin)
B = tk.Button(self,text = 'Confirm',command = self.getChoices).grid(row = 3) #This is the button that the user clicks to confirm the selection
#create listbox
self.LB = tk.Listbox(self,height = 10,width = 45,selectmode = 'multiple')
self.LB.grid()
for x in range(10):
self.LB.insert(tk.END,f"this is item {x}")
def getChoices(self):
self.choice = self.LB.curselection() # <== save the choice as an attribute
self.destroy()
MainWin().mainloop()
如果需要,您也可以将其另存为主窗口的属性:
def getChoices(self):
self.master.choice = self.LB.curselection()
self.destroy()
或者其他任何地方。
,由于您使用了 .wait_window()
,这意味着您希望 Toplevel()
的行为类似于模态对话框。
以下修改为 dialogWin()
以充当模态对话框:
class dialogWin(tk.Toplevel):
'''
This window creates and displays the listbox.
'''
def __init__(self,MainWin):
super().__init__(MainWin)
# initialize empty selected choice
self.choice = ()
# ... omitted code
# ...
tk.Button(self,text='Confirm',command=self.getChoices).grid(row=3) #This is the button that the user clicks to confirm the selection
#create listbox
self.LB = tk.Listbox(self,height=10,width=45,selectmode='multiple')
# ... code to configure the listbox appearence
def getChoices(self):
'''
This is the callback function the listbox uses.
'''
# save the selected choices
self.choice = self.LB.curselection()
self.destroy()
# added function to be called like a dialog
def show(self):
self.wait_visibility()
self.grab_set()
self.master.wait_window(self)
# return the selected choices
return self.choice
然后您可以使用 dialogWin
作为 MainWin
内的模态对话框:
class MainWin(tk.Tk):
def __init__(self):
super().__init__()
# ... omitted code
def dia(self):
'''
This creates a toplevel window that displays the listbox.
'''
choice = dialogWin(self).show()
print(choice)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。