gpt4 book ai didi

python - 如何让 Tkinter 事件监听器工作?

转载 作者:行者123 更新时间:2023-12-01 07:06:41 28 4
gpt4 key购买 nike

我使用 Tkinter 作为我用 Python 编写的小工具的 GUI。基本上我只想在条目小部件的内容发生更改时立即执行回调方法。这可以使用 Tkinter 自己的变量类(StringVar、BooleanVar 等 - 有关详细信息,请参阅文档: http://effbot.org/tkinterbook/variable.htm )来完成。

所以我无法让该机制发挥作用,我在网上找到了一个片段,它运行得非常好。现在我试图找出为什么我的版本不起作用。正如您在两个代码示例中看到的,唯一的区别是,我在类中使用事件监听功能,而我在网上找到的代码片段仅以直接从上到下的方式演示它。这是我已经尝试过的:

  • 我直接在 GUI 类的构造函数中实例化了 Tk 实例 - 行为相同。
  • 我直接从 Tk 类(而不是 Frame)继承 - 相同的行为。
  • 我将回调放在类之外 - 相同的行为。
我唯一的想法是问题可能与范围相关,我试图验证这一点。

工作代码片段:

from tkinter import *
import tkinter as tk

def text_changed(*args):
print("Text changed.")

top = tk.Tk()

string_listener = StringVar()
string_listener.set("Init Text")
string_listener.trace("w", text_changed)

entry_widget = tk.Entry(top, textvariable = string_listener)
entry_widget.pack()

top.mainloop()

不工作的代码片段

from tkinter import *
import tkinter as tk

root = tk.Tk()

class GUI(tk.Frame):
def __init__(self, master=root):
super(GUI, self).__init__(master)

string_listener = StringVar()
string_listener.set("Init Text")
string_listener.trace("w", self.text_changed_callback)

entry_widget = tk.Entry(master, textvariable=string_listener)
entry_widget.pack()

def text_changed_callback(self, *args):
print("Text changed.")

gui = GUI()
gui.mainloop()

就像在工作示例中一样,每次从 extry-widget 中的字符串中删除或附加一个字符时,我的代码应该打印 Text Changed.

最佳答案

问题是 string_listener 是一个局部变量,当 __init__ 运行完成时,python 正在销毁该变量。这在您的原始代码中不会发生,因为该变量是在全局范围内创建的。

一个简单的解决方案是将引用保存为类的属性:

import tkinter as tk

root = tk.Tk()

class GUI(tk.Frame):
def __init__(self, master=root):
super(GUI, self).__init__(master)

self.string_listener = tk.StringVar()
self.string_listener.set("Init Text")
self.string_listener.trace("w", self.text_changed_callback)

entry_widget = tk.Entry(master, textvariable=self.string_listener)
entry_widget.pack()

def text_changed_callback(self, *args):
print("Text changed.")

gui = GUI()
gui.mainloop()

注意:我还将 StringVar 更改为 tk.StringVar,以便删除 tkinter 的冗余通配符导入。

关于python - 如何让 Tkinter 事件监听器工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58417529/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com