我正在使用带有tkinter的Python3.当按下按钮时,应该弹出一个子窗口,其中包含一个旋转框.微调框的初始值应该是一个参数.子窗口还包含一个"Set"按钮.当按下按钮时,子窗口应该关闭,并且旋转框的值应该传递给父应用程序.

在我的最小非工作示例中,主窗口中的旋转框及其对应的按钮按预期工作.但是,子窗口中的相同代码不起作用,既没有正确设置初始值,也没有将微调框的值返回给主应用程序.

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()

我还try 将我的子窗口实现为一个函数,而不是行为没有变化的类.

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()

我真的不能把我的头周围可能是什么问题在这里,任何 idea ?

提前谢谢!

推荐答案

在第二个脚本中,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)

Python相关问答推荐

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

Scrapy和Great Expectations(great_expectations)—不合作

Pandas Loc Select 到NaN和值列表

在Python中,从给定范围内的数组中提取索引组列表的更有效方法

Django admin Csrf令牌未设置

判断solve_ivp中的事件

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

巨 Python :逆向猜谜游戏

pandas fill和bfill基于另一列中的条件

Pandas 数据帧中的枚举,不能在枚举列上执行GROUP BY吗?

需要帮助使用Python中的Google的People API更新联系人的多个字段'

Seaborn散点图使用多个不同的标记而不是点

对数据帧进行分组,并按组间等概率抽样n行

PYTHON中的selenium不会打开 chromium URL

Numpy`astype(Int)`给出`np.int64`而不是`int`-怎么办?

如何在不不断遇到ChromeDriver版本错误的情况下使用Selify?

如何使用Polars从AWS S3读取镶木地板文件

如何让PYTHON上的Selify连接到现有的Firefox实例-我无法连接到Marionette端口

Fake pathlib.使用pyfakefs的类变量中的路径'

元组列表:如果第一个元组元素匹配,则合并两个数据帧列