我正在使用带有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相关问答推荐

如何制作10,000年及以后的日期时间对象?

基于字符串匹配条件合并两个帧

在Python中动态计算范围

当点击tkinter菜单而不是菜单选项时,如何执行命令?

提取相关行的最快方法—pandas

为什么\b在这个正则表达式中不解释为反斜杠

Pandas Data Wrangling/Dataframe Assignment

导入错误:无法导入名称';操作';

如果包含特定值,则筛选Groupby

将一个双框爆炸到另一个双框的范围内

Pandas—MultiIndex Resample—我不想丢失其他索引的信息´

pandas:在操作pandora之后将pandora列转换为int

我对这个简单的异步者的例子有什么错误的理解吗?

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

在Django中重命名我的表后,旧表中的项目不会被移动或删除

Django在一个不是ForeignKey的字段上加入'

高效生成累积式三角矩阵

EST格式的Azure数据库笔记本中的当前时间戳

在Pandas 中以十六进制显示/打印列?

合并Pandas中的数据帧,但处理不存在的列