我正在使用 Python 3 和 tkinter。按下按钮时,应弹出一个包含旋转框的子窗口。旋转框的初始值应该是一个参数。子窗口还包含一个“设置”按钮。当按下按钮时,子窗口应该关闭,并且旋转框的值应该传递给父应用程序。
在我的最小的非工作示例中,主窗口中的旋转框及其相应的按钮按预期工作。然而,相同的代码在子窗口中不起作用,既没有正确设置初始值,也没有将旋转框的值返回到主应用程序。
import tkinter as tk
class spin_child:
def __init__(self, value, callback):
self.root = tk.Tk()
self.callback = callback
self.var_spin = tk.IntVar()
self.spin = tk.Spinbox(self.root, from_=0, to=100, textvariable=self.var_spin, width=10)
self.spin.pack()
self.button = tk.Button(self.root, text="Set", command=lambda: self.return_value(self.var_spin.get()), width=20)
self.button.pack()
def close_window(self):
self.root.destroy()
def return_value(self, value):
self.callback(value)
self.root.destroy()
def run(self):
self.root.mainloop()
def callback(value):
print(value)
root = tk.Tk()
btn = tk.Button(root, text="Open Window", command=lambda: spin_child(20, callback), width=50)
btn.pack()
var_spin = tk.IntVar()
var_spin.set(20)
spin = tk.Spinbox(root, from_=0, to=100, textvariable=var_spin, width=10)
spin.pack()
btn = tk.Button(root, text="Local Spin", command=lambda: print(var_spin.get()), width=50)
btn.pack()
root.mainloop()
我还尝试将我的子窗口实现为函数而不是行为没有变化的类。
import tkinter as tk
def spin_child(value, callback):
def return_value(value):
callback(value)
root.destroy()
root = tk.Tk()
callback = callback
var_spin = tk.IntVar()
spin = tk.Spinbox(root, from_=0, to=100, textvariable=var_spin, width=10)
spin.pack()
button = tk.Button(root, text="Set", command=lambda: return_value(var_spin.get()), width=20)
button.pack()
root.mainloop()
def callback(value):
print(value)
root = tk.Tk()
btn = tk.Button(root, text="Open Window", command=lambda: spin_child(20, callback), width=50)
btn.pack()
var_spin = tk.IntVar()
var_spin.set(20)
spin = tk.Spinbox(root, from_=0, to=100, textvariable=var_spin, width=10)
spin.pack()
btn = tk.Button(root, text="Local Spin", command=lambda: print(var_spin.get()), width=50)
btn.pack()
root.mainloop()
我真的无法理解这里可能存在什么问题,有什么想法吗?
提前致谢!
在第二个脚本中,
callback
函数。
编辑:
使用一个
tk()
和一个mainloop()
将完成整个脚本,而Toplevel()
将完成一个,但不需要添加mainloop()
。
在第 8 行,这可能会导致问题。所以用
Toplevel()
在第 8 行,将其更改为
root = tk.Toplevel()
而不是 tk.Tk()
第 17 行,注释掉
#root.mainloop()
22号线,
add var_spin.set(value)
片段:
def callback(value):
print(value)
var_spin.set(value)