gpt4 book ai didi

python - Stacked Widgets 触发它们自己的事件

转载 作者:太空宇宙 更新时间:2023-11-03 10:54:12 24 4
gpt4 key购买 nike

我在使用事件处理程序绑定(bind)时遇到问题。

我在主框架上放置了两个堆叠框架。每个框架都有自己的按钮。当我点击一个按钮时,相关的框架被抬起。

在每一帧上,我都有一个列表框。这些列表框在主框架上的相同位置。当我在第一个列表框中选择一个项目时,它会用新内容填充另一个列表框。然后我单击第二个框架按钮以访问我的第二个列表框。我复制了(使用新名称)事件以对我的第二个列表框执行完全相同的操作以填充第三个列表框。

但是,当我在我的第二个列表框中选择一个项目时,似乎第一个列表框的事件也被触发但只有一次(如果我重做我的选择它只会触发第二个列表框的事件)。

编辑:我按要求放置了一个“简短”版本的代码。

当我在第一个列表框中选择 db1 或 db2 时,frame2 被提升并打印出 test2。然后我选择 item1 或 item2,test2/test1 都被打印出来,而不是只打印 test1

from tkinter import *

class Page(Frame):
def __init__(self, *args, **kwargs):
Frame.__init__(self, *args, **kwargs)
def show(self):
self.lift()

class Page1(Page):

def dbCheckCommand(self, event, page2):
page2.collections.delete(0, END)
print("test2")
page2.collections.insert(END, "item1")
page2.collections.insert(END, "item2")

def __init__(self, *args, **kwargs):
Page.__init__(self, *args, **kwargs)
self.grid_columnconfigure(0, weight=1)
self.databases = Listbox(self, height=2)
self.grid_rowconfigure(1, weight=1)
self.databases.insert(END, "db1")
self.databases.insert(END, "db2")
self.databases.grid(row=1, sticky="nsew")

class Page2(Page):
def __init__(self, *args, **kwargs):
Page.__init__(self, *args, **kwargs)
self.grid_columnconfigure(0, weight=1)
self.colls = []
self.collections = Listbox(self, height=2)
self.grid_rowconfigure(1, weight=1)
self.collections.grid(row=1, sticky="nsew")

class MainView(Frame):

def on_p1_listbox_selection(self, event, page1, page2):
page1.dbCheckCommand(event, page2)
page2.lift()

def on_p2_listbox_selection(self, event):
print("test1")

def __init__(self, *args, **kwargs):
Frame.__init__(self, *args, **kwargs)

self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(1, weight=5)
buttonframe = Frame(self)
container = Frame(self)
buttonframe.grid(column=0, row=0, sticky="nsew")

container.grid(column=1, row=0, sticky="nsew")
container.grid_columnconfigure(0, weight=1)
container.grid_rowconfigure(0, weight=1)

p1 = Page1(container)
p2 = Page2(container)

p1.grid(column=0, row=0, sticky="nsew")
p2.grid(column=0, row=0, sticky="nsew")


b1 = Button(buttonframe, text="1 - Server & Database", command=p1.lift)
b2 = Button(buttonframe, text="2 - Collection", command=p2.lift)

b1.pack(fill="both", expand=1)
b2.pack(fill="both", expand=1)


p1.databases.bind("<<ListboxSelect>>", lambda event: self.on_p1_listbox_selection(event, p1, p2))
p2.collections.bind("<<ListboxSelect>>", lambda event: self.on_p2_listbox_selection(event))

p1.show()


if __name__ == "__main__":
root = Tk()
main = MainView(root)
main.pack(fill="both", expand=1)
root.wm_geometry("1100x500")
root.wm_title("MongoDB Timed Sample Generator")
root.mainloop()

最佳答案

<<ListboxSelect>>只要选择更改,就会触发事件。这意味着无论是在做出新选择时,还是在取消选择当前选择时。

默认情况下,列表框中的选定项将导出到 X selection .由于始终只能有一个X 个选择,因此当您在一个列表框中选择一项时,任何其他列表框都将被取消选择。因此,当您单击第二个列表框中的项目时,第一个列表框的选择将丢失,并导致 <<ListboxSelect>>要发送的事件。

一个简单的解决方案是在您的列表框中关闭此行为,这样您就可以同时在每个列表框中选择一些内容。您可以通过设置 exportselection 来做到这一点标记为 False在每个列表框中。

例如:

self.databases = Listbox(..., exportselection=False)
...
self.collections = Listbox(..., exportselection=False)

关于python - Stacked Widgets 触发它们自己的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44523840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com