如何访问FreeSimpleGUI底层的TKinter Listbox对象?
获取FreeSimpleGUI Listbox关联的Tkinter Listbox对象
针对你使用的FreeSimpleGUI v5.2.0.post1 TKinter模式,这里提供两个可靠方法获取底层Tkinter Listbox对象:
方法一:直接访问Widget属性
FreeSimpleGUI的大部分元素都通过Widget属性暴露底层Tkinter组件,Listbox也遵循这个规则。注意必须等窗口渲染完成后再访问——因为FSG采用延迟创建组件的策略,初始化阶段Tkinter组件还未生成,此时Widget会返回None。
示例代码:
import FreeSimpleGUI as sg layout = [[sg.Listbox(['选项1', '选项2'], key='-MY_LIST-')]] window = sg.Window('测试窗口', layout) # 触发窗口渲染(timeout=0的read不会阻塞程序) window.read(timeout=0) # 获取FSG Listbox对象 fsg_listbox = window['-MY_LIST-'] # 获取对应的Tkinter Listbox tk_listbox = fsg_listbox.Widget # 验证类型 print(type(tk_listbox)) # 输出 <class 'tkinter.Listbox'> window.close()
方法二:用Tkinter的nametowidget解析路径名
你打印self.TKListbox得到的.toplevel.!frame.!frame.!frame.!frame2.!frame.!frame.!frame2.!frame.!listbox,其实是Tkinter组件的路径名称。可以通过窗口的Tk根对象调用nametowidget方法,传入这个路径就能拿到组件对象。
示例代码:
# 承接上面的代码,窗口渲染完成后 path = fsg_listbox.TKListbox tk_listbox = window.TKroot.nametowidget(path)
为什么初始化时self.TKListbox是None?
FreeSimpleGUI的组件采用延迟初始化,只有当窗口被显示(调用read()、show()等方法)后,才会实际创建对应的Tkinter组件,并给TKListbox、Widget这类属性赋值,所以初始化阶段访问这些属性会得到None。
内容的提问来源于stack exchange,提问作者Darien Marks
相关产品推荐
相关产品推荐

