Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以执行我自己的Tkinter自定义跟踪变量类型?_Python_Python 3.x_User Interface_Tkinter - Fatal编程技术网

Python 是否可以执行我自己的Tkinter自定义跟踪变量类型?

Python 是否可以执行我自己的Tkinter自定义跟踪变量类型?,python,python-3.x,user-interface,tkinter,Python,Python 3.x,User Interface,Tkinter,我想知道是否有可能创建一个MyValueVar类型,相当于StringVar、BooleanVar、DoubleVar 我已经阅读了学习Python的书籍,我已经完成了Python编程的一半,并且几乎完成了Tkinter GUI应用程序开发蓝图。我还在互联网上用谷歌搜索,还没有找到任何关于如何创建这种数据类型的信息 我的愿望是创建一个类(它可能是一个mixin类),可以附加到我的可视组件上,并且每次可视组件更改时,其内部值(自定义类对象实例)也会更改。最好有一些MyValueVar类型的变量,它

我想知道是否有可能创建一个MyValueVar类型,相当于StringVar、BooleanVar、DoubleVar

我已经阅读了学习Python的书籍,我已经完成了Python编程的一半,并且几乎完成了Tkinter GUI应用程序开发蓝图。我还在互联网上用谷歌搜索,还没有找到任何关于如何创建这种数据类型的信息

我的愿望是创建一个类(它可能是一个mixin类),可以附加到我的可视组件上,并且每次可视组件更改时,其内部值(自定义类对象实例)也会更改。最好有一些MyValueVar类型的变量,它将与可视化组件同步

对我来说,知道必须实现哪些类、哪些方法或接口,以及总体上要坚持的一些文档就足够了


提前感谢

根据评论,听起来您真正需要的是在视觉组件更改时发出通知。这可以通过虚拟事件来完成

下面是一个在组件更改颜色时更新标签的示例。每秒钟,组件将拾取一个随机颜色;如果它与当前颜色不同,它将更改,并发送主程序正在侦听的事件。检测到事件时,标签将更新

import tkinter as tk
import random

COLORS = ("red", "green", "yellow")
class Component(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self.value = self.cget("background")
        self.after(1000, self.maybe_change)

    def maybe_change(self):
        new_color = random.choice(COLORS)
        if self.value != new_color:
            self.value = new_color
            self.configure(background=new_color)
            self.event_generate("<<ComponentChanged>>")
        self.after(1000, self.maybe_change)


class App(object):
    def __init__(self):
        self.root = tk.Tk()
        self.component = Component(self.root, width=300, height=50)
        self.label = tk.Label(self.root, text="")

        self.component.pack(side="top", fill="both", expand=True)
        self.label.pack(side="bottom", fill="x")

        self.component.bind("<<ComponentChanged>>",
                            self.handle_component_change)

    def handle_component_change(self, event):
        self.label.configure(text="component value is now '%s'" % self.component.value)

    def start(self):
        self.root.mainloop()

app = App()
app.start()
将tkinter作为tk导入
随机输入
颜色=(“红色”、“绿色”、“黄色”)
类组件(tk.Frame):
定义初始化(self,*args,**kwargs):
tk.Frame.\uuuu init\uuuuu(self,*args,**kwargs)
self.value=self.cget(“背景”)
赛尔夫(1000,赛尔夫,可能会改变)
def可能改变(自我):
新颜色=随机。选择(颜色)
如果自我价值!=新颜色:
self.value=新颜色
自我配置(背景=新颜色)
self.event_generate(“”)
赛尔夫(1000,赛尔夫,可能会改变)
类应用程序(对象):
定义初始化(自):
self.root=tk.tk()
self.component=component(self.root,宽度=300,高度=50)
self.label=tk.label(self.root,text=”“)
self.component.pack(side=“top”,fill=“both”,expand=True)
自贴标签包装(side=“bottom”,fill=“x”)
self.component.bind(“,
自行处理(组件更改)
def句柄组件更改(自身、事件):
self.label.configure(text=“组件值现在是“%s”%”%self.component.value)
def启动(自):
self.root.mainloop()
app=app()
app.start()

它是否需要是一个变量?当可视组件发生更改时,它会发出一个您可以绑定到的事件,这是否也同样有效?当视觉组件发生变化,内部值也随之发生变化时,会发生什么?如果您创建了这个变量,并且值发生了变化,您将如何使用该变量?换句话说,“是的,这是可能的”。具体怎么做取决于你到底想做什么。我能理解你的观点。在创建可视组件时,我会绑定我的自定义变量,例如,与StringVar一样。那么我只需要在需要的地方使用或传递这个变量。既然你使用的是绑定,你需要使用特殊的变量吗?绑定函数不能直接从组件获取值吗?换句话说,您可以使用
MyComponent.get
而不是
MyVariable.get
。为什么在似乎有更简单的解决方案时,这必须是一个特殊变量?嗯。也许你是对的,在深入思考之前,我问得太早了,这可能不是最好的解决方案。我将进一步分析。