Python Tkinter 在销毁后通过多个 windows 和 return 值进行通信
Python Tkinter communicate through multiple windows and return values after destroy
我想用多个 tkinter 制作一个程序 windows,但我遇到了一些问题。我有一个包含一个按钮的主window。按下该按钮后,将打开一个顶层,其中包含通过用户输入一些数据的小部件。这个顶层还包含一个按钮,一旦按下,顶层就会被销毁,引入的数据将返回给第一个按钮的事件调用的函数。主 window 被销毁,数据作为参数传递给第三个 window 将使用它。
from tkinter import *
def third_window(data):
root = Tk()
lbl = Label(root, text=data)
lbl.place(x=20,y=20)
root.mainloop()
def second_window():
def event_btn(event):
e = entry.get()
if len(e) != 0:
root.destroy()
print(e)
return e
root = Toplevel()
root.geometry("400x400+200+200")
entry = Entry(root, width=15)
entry.place(x=30,y=30)
btn = Button(root, text="Send")
btn.bind("<Button-1>", event_btn)
btn.place(x=80, y=80)
root.wait_window()
root.mainloop()
def main():
def event_btn(event):
data = second_window()
print(data)
root.destroy()
third_window(data)
root = Tk()
root.geometry("200x200+100+100")
btn = Button(root, text="Test button")
btn.bind("<Button-1>", event_btn)
btn.place(x=50, y=50)
root.mainloop()
if __name__ == "__main__":
main()
我遇到了 2 个问题:顶层被销毁后主 window 没有关闭并且顶层的数据没有返回。
让它工作的一种方法是简单地撤回根 window 而不是销毁它,并使用 StringVar
来传递数据。
你也可以简单地用你的新布局重写根目录,如果你不再需要上面的内容,我会看看其他例子。
您现在面临的主要问题之一是在数据传递到根之前销毁 TopLevel,但在 return 调用之后销毁将忽略销毁,它不会就像将 TopLevel 传递给根,无论如何对我来说。
我真的不明白为什么您更喜欢 <bind>
而不是按钮的 command
属性。
from tkinter import *
def third_window(data):
top = Toplevel()
lbl = Label(top, text=data)
lbl.place(x=20,y=20)
top.wait_window()
def second_window(root, v):
def event_btn():
if len(v.get()) != 0:
top.destroy()
top = Toplevel()
top.geometry("400x400+200+200")
entry = Entry(top, textvariable = v, width=15)
entry.place(x=30,y=30)
btn = Button(top, text="Send", command = event_btn)
btn.place(x=80, y=80)
root.wait_window(top)
def main():
def event_btn():
second_window(root, v)
print(v.get())
root.withdraw()
third_window(v.get())
root = Tk()
root.geometry("200x200+100+100")
btn = Button(root, text="Test button", command = event_btn)
btn.place(x=50, y=50)
v = StringVar()
root.mainloop()
if __name__ == "__main__":
main()
一种方法是隐藏根 window 使用顶级 window 然后更新 window。这让我们可以把事情压缩很多。
import tkinter as tk
def second_window():
root.withdraw()
top = tk.Toplevel(root)
top.geometry("400x400+200+200")
entry = tk.Entry(top, width=15)
entry.place(x=30,y=30)
def actions():
x = entry.get()
entry.destroy()
btn.destroy()
tk.Label(top, text=x).place(x=20,y=20)
btn = tk.Button(top, text="Send", command=actions)
btn.place(x=80, y=80)
if __name__ == "__main__":
root = tk.Tk()
root.geometry("200x200+100+100")
tk.Button(root, text="Test button", command=second_window).place(x=50, y=50)
root.mainloop()
就我个人而言,我更喜欢 OOP 方法,它使事情更容易管理。
import tkinter as tk
class Example(tk.Tk):
def __init__(self):
super().__init__()
self.geometry("200x200+100+100")
self.btn = tk.Button(self, text="Test button", command=self.update_window)
self.btn.place(x=50, y=50)
def update_window(self):
self.geometry("400x400+200+200")
self.entry = tk.Entry(self, width=15)
self.entry.place(x=30,y=30)
self.btn.config(text="Send", command=self.actions)
self.btn.place(x=80, y=80)
def actions(self):
tk.Label(self, text=self.entry.get()).place(x=20,y=20)
self.btn.destroy()
self.entry.destroy()
if __name__ == "__main__":
Example().mainloop()
也就是说您可能不需要使用 place。一旦您学会了如何正确使用它们,您将能够从 grid()
或 pack()
获得您需要的外观。
我想用多个 tkinter 制作一个程序 windows,但我遇到了一些问题。我有一个包含一个按钮的主window。按下该按钮后,将打开一个顶层,其中包含通过用户输入一些数据的小部件。这个顶层还包含一个按钮,一旦按下,顶层就会被销毁,引入的数据将返回给第一个按钮的事件调用的函数。主 window 被销毁,数据作为参数传递给第三个 window 将使用它。
from tkinter import *
def third_window(data):
root = Tk()
lbl = Label(root, text=data)
lbl.place(x=20,y=20)
root.mainloop()
def second_window():
def event_btn(event):
e = entry.get()
if len(e) != 0:
root.destroy()
print(e)
return e
root = Toplevel()
root.geometry("400x400+200+200")
entry = Entry(root, width=15)
entry.place(x=30,y=30)
btn = Button(root, text="Send")
btn.bind("<Button-1>", event_btn)
btn.place(x=80, y=80)
root.wait_window()
root.mainloop()
def main():
def event_btn(event):
data = second_window()
print(data)
root.destroy()
third_window(data)
root = Tk()
root.geometry("200x200+100+100")
btn = Button(root, text="Test button")
btn.bind("<Button-1>", event_btn)
btn.place(x=50, y=50)
root.mainloop()
if __name__ == "__main__":
main()
我遇到了 2 个问题:顶层被销毁后主 window 没有关闭并且顶层的数据没有返回。
让它工作的一种方法是简单地撤回根 window 而不是销毁它,并使用 StringVar
来传递数据。
你也可以简单地用你的新布局重写根目录,如果你不再需要上面的内容,我会看看其他例子。
您现在面临的主要问题之一是在数据传递到根之前销毁 TopLevel,但在 return 调用之后销毁将忽略销毁,它不会就像将 TopLevel 传递给根,无论如何对我来说。
我真的不明白为什么您更喜欢 <bind>
而不是按钮的 command
属性。
from tkinter import *
def third_window(data):
top = Toplevel()
lbl = Label(top, text=data)
lbl.place(x=20,y=20)
top.wait_window()
def second_window(root, v):
def event_btn():
if len(v.get()) != 0:
top.destroy()
top = Toplevel()
top.geometry("400x400+200+200")
entry = Entry(top, textvariable = v, width=15)
entry.place(x=30,y=30)
btn = Button(top, text="Send", command = event_btn)
btn.place(x=80, y=80)
root.wait_window(top)
def main():
def event_btn():
second_window(root, v)
print(v.get())
root.withdraw()
third_window(v.get())
root = Tk()
root.geometry("200x200+100+100")
btn = Button(root, text="Test button", command = event_btn)
btn.place(x=50, y=50)
v = StringVar()
root.mainloop()
if __name__ == "__main__":
main()
一种方法是隐藏根 window 使用顶级 window 然后更新 window。这让我们可以把事情压缩很多。
import tkinter as tk
def second_window():
root.withdraw()
top = tk.Toplevel(root)
top.geometry("400x400+200+200")
entry = tk.Entry(top, width=15)
entry.place(x=30,y=30)
def actions():
x = entry.get()
entry.destroy()
btn.destroy()
tk.Label(top, text=x).place(x=20,y=20)
btn = tk.Button(top, text="Send", command=actions)
btn.place(x=80, y=80)
if __name__ == "__main__":
root = tk.Tk()
root.geometry("200x200+100+100")
tk.Button(root, text="Test button", command=second_window).place(x=50, y=50)
root.mainloop()
就我个人而言,我更喜欢 OOP 方法,它使事情更容易管理。
import tkinter as tk
class Example(tk.Tk):
def __init__(self):
super().__init__()
self.geometry("200x200+100+100")
self.btn = tk.Button(self, text="Test button", command=self.update_window)
self.btn.place(x=50, y=50)
def update_window(self):
self.geometry("400x400+200+200")
self.entry = tk.Entry(self, width=15)
self.entry.place(x=30,y=30)
self.btn.config(text="Send", command=self.actions)
self.btn.place(x=80, y=80)
def actions(self):
tk.Label(self, text=self.entry.get()).place(x=20,y=20)
self.btn.destroy()
self.entry.destroy()
if __name__ == "__main__":
Example().mainloop()
也就是说您可能不需要使用 place。一旦您学会了如何正确使用它们,您将能够从 grid()
或 pack()
获得您需要的外观。