如何正确设置和获取子窗口中 tkinter spinbox 的值?

问题描述 投票:0回答:1

我正在使用 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()

我真的无法理解这里可能存在什么问题,有什么想法吗?

提前致谢!

python tkinter window spinbox
1个回答
1
投票

在第二个脚本中,

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)
© www.soinside.com 2019 - 2024. All rights reserved.