当前位置: 首页 > 知识库问答 >
问题:

tkinter输入字段自动更新

范霄
2023-03-14

每次鼠标左键单击,自我。LEFT_MB_Counter递增,因此值始终在变化。我想要中的值。LEFT_MB_Counter显示在条目字段self.left_MB_entry,但我无法实现这一点。

如何使输入字段始终更新并在self中显示当前值。左侧计数器

from win32api import GetKeyState
import tkinter.ttk
import tkinter


class MainApplication:
    """Class that creates the widgets and window."""
    def __init__(self, master):
        """Method that creates the class constructor."""
        self.master = master
        self.var = tkinter.IntVar(value=0)   
        self.left_MB_entry = self.Entry(self.var)
        self.left_MB_entry.grid()

    def Entry(self, text_var, justify="center"):
        """Method that defines a default entry field."""
        entry = tkinter.ttk.Entry(self.master, textvariable=text_var, justify=justify)
        return entry

class MouseCounter:
    """Class that counts mouse button clicks."""
    def __init__(self):
        """Method that creates the class constructor."""
        self.LEFT_MB = 0x01  # Virtual-key code from Microsoft for LEFT MButton
        self.Old_State_LEFT_MB = GetKeyState(self.LEFT_MB)  # LEFT MButton Down = -127 or -128, MButton Up = 0 or 1
        self.LEFT_MB_Counter = 0  # Initialize to 0

    def count(self):
        # Following block of code monitors LEFT MButton
        New_State_LEFT_MB = GetKeyState(self.LEFT_MB)
        if New_State_LEFT_MB != self.Old_State_LEFT_MB:  # Button state changed
            self.Old_State_LEFT_MB = New_State_LEFT_MB
            print(New_State_LEFT_MB)
            if New_State_LEFT_MB < 0:
                self.LEFT_MB_Counter += 1
                print("Count:", self.LEFT_MB_Counter)
                print('Left Button Pressed')
            else:
                print('Left Button Released')
        root.after(1, self.count)


root = tkinter.Tk()
root.style = tkinter.ttk.Style()
#  ('winnative', 'clam', 'alt', 'default', 'classic', 'vista', 'xpnative')
root.style.theme_use("clam")
APP = MainApplication(root)  # Create object instance of the user interface
root.after(0, MouseCounter().count())
root.mainloop()  # Display the user interface

共有3个答案

童宏富
2023-03-14

一个选项是使左\u MB_计数器成为可由条目直接使用的IntVar

from multiprocessing import Process, Pipe
import time
from win32api import GetKeyState
import tkinter.ttk
import tkinter


class MainApplication(object):
    """Class that creates the widgets and window."""
    def __init__(self, master):
        """Method that creates the class constructor."""
        self.master = master
        self.mc = MouseCounter(master)
        root.after(0, self.mc.count)
        self.left_MB_entry = self.Entry(self.mc.LEFT_MB_Counter)
        self.left_MB_entry.grid()


    def Entry(self, text_var, justify="center"):
        """Method that defines a default entry field."""
        entry = tkinter.ttk.Entry(self.master, textvariable=text_var, justify=justify)
        return entry

class MouseCounter:
    """Class that counts mouse button clicks."""
    def __init__(self, master):
        """Method that creates the class constructor."""
        self.master = master
        self.LEFT_MB = 0x01  # Virtual-key code from Microsoft for LEFT MButton
        self.Old_State_LEFT_MB = GetKeyState(self.LEFT_MB)  # LEFT MButton Down = -127 or -128, MButton Up = 0 or 1
        self.LEFT_MB_Counter = tkinter.IntVar(0)  # Initialize to 0

    def count(self):
        # Following block of code monitors LEFT MButton
        New_State_LEFT_MB = GetKeyState(self.LEFT_MB)
        if New_State_LEFT_MB != self.Old_State_LEFT_MB:  # Button state changed
            self.Old_State_LEFT_MB = New_State_LEFT_MB
            print(New_State_LEFT_MB)
            if New_State_LEFT_MB < 0:
                self.LEFT_MB_Counter.set(self.LEFT_MB_Counter.get() + 1)
                print("Count:", self.LEFT_MB_Counter.get())
                print('Left Button Pressed')
            else:
                print('Left Button Released')
        self.master.after(1, self.count)


root = tkinter.Tk()
root.style = tkinter.ttk.Style()
root.style.theme_use("clam")
APP = MainApplication(root) 

root.mainloop()  # Display the user interface

柳涵映
2023-03-14
匿名用户

通过更新名为APP的IntVar属性,您可以轻松地完成此操作。鼠标计数器中的main应用程序实例的var。count()方法。

下面是您的代码的修改版本,显示了如何做到这一点:

from win32api import GetKeyState
import tkinter.ttk
import tkinter


class MainApplication:
    """Class that creates the widgets and window."""
    def __init__(self, master):
        """Method that creates the class constructor."""
        self.master = master
        self.var = tkinter.IntVar(value=0)
        self.left_MB_entry = self.Entry(self.var)
        self.left_MB_entry.grid()

    def Entry(self, text_var, justify="center"):
        """Method that defines a default entry field."""
        entry = tkinter.ttk.Entry(self.master, textvariable=text_var, justify=justify)
        return entry

class MouseCounter:
    """Class that counts mouse button clicks."""
    def __init__(self, variable):
        """Method that creates the class constructor."""
        self.LEFT_MB = 0x01  # Virtual-key code from Microsoft for LEFT MButton
        self.Old_State_LEFT_MB = GetKeyState(self.LEFT_MB)  # LEFT MButton Down = -127 or -128, MButton Up = 0 or 1
        self.LEFT_MB_Counter = 0  # Initialize to 0
        self.variable = variable
        self.variable.set(self.LEFT_MB_Counter)

    def count(self):
        # Following block of code monitors LEFT MButton
        New_State_LEFT_MB = GetKeyState(self.LEFT_MB)
        if New_State_LEFT_MB != self.Old_State_LEFT_MB:  # Button state changed
            self.Old_State_LEFT_MB = New_State_LEFT_MB
            print(New_State_LEFT_MB)
            if New_State_LEFT_MB < 0:
                self.LEFT_MB_Counter += 1
                self.variable.set(self.LEFT_MB_Counter)
                print("Count:", self.LEFT_MB_Counter)
                print('Left Button Pressed')
            else:
                print('Left Button Released')
        root.after(1, self.count)


root = tkinter.Tk()
root.style = tkinter.ttk.Style()
#  ('winnative', 'clam', 'alt', 'default', 'classic', 'vista', 'xpnative')
root.style.theme_use("clam")
APP = MainApplication(root)  # Create object instance of the user interface
mouse_counter = MouseCounter(APP.var)  # Create an instance outside of mainloop.
root.after(0, mouse_counter.count)
root.mainloop()  # Display the user interface

华欣怡
2023-03-14

问题的根源很简单,Mouse计数器的实例没有对应用程序的引用,因此不能影响应用程序中的任何内容。这不是tkinter独有的,它只是python的基本原理。要更改对象,您需要对对象的引用。

一旦您确保MouseCounter的实例引用了MainApplication的实例,这个问题就变得非常容易解决了。

您需要做的第一件事是将var与条目小部件正确关联。代码将其作为位置参数传递,这不是正确的方法。您需要将变量分配给textvariable属性:

    self.var = tkinter.IntVar(value=0)   
    self.left_MB_entry = self.Entry(textvariable=self.var)

接下来,您需要确保能够传递主应用程序的实例:

class MouseCounter:
    """Class that counts mouse button clicks."""
    def __init__(self, master):
        self.master = master
        ...

创建实例时,将APP作为main应用程序的实例传入:

APP = MainApplication(root)
mc = MouseCounter(APP) 
root.after(0, mc.count)

接下来,您只需从计数器更新var

def count(self):
    ...
        if New_State_LEFT_MB < 0:
            ...
            self.master.var.set(self.LEFT_MB_Counter)
            ...

注意:您对之后的如何工作有一点误解。它不会影响代码,但是如果你要使用它,你应该正确地使用它。

考虑以下代码:

root.after(0, MouseCounter().count())

其功能与以下相同:

result = MouseCounter().count()
root.after(0, None)

after需要对函数的引用,而不是实际的函数调用。您需要删除后面的括号:

root.after(0, MouseCounter().count)

更好的做法是创建MouseCounter的实例并保存引用,这样垃圾收集器就不会获取引用:

counter = MouseCounter()
root.after(0, counter.count)

 类似资料:
  • 问题内容: 我对从Tkinter()输入字段获取值感到困惑。我有这种代码… 但是似乎我的valueGET(val1,val2)方法无法正常工作,它没有打印出该值,甚至没有通过使用Tkinter()条目的get()方法获得该值,我做错了吗?以及应该怎么做? 提前致谢 … 问题答案: 甚至在创建按钮之前就进行代码调用。然后,它将函数的返回值作为参数传递给Button构造函数。 要将函数注册为回调,请替

  • 我正在尝试用Angular构建一个简单的计算器,如果我想的话,我可以覆盖总数。我有这部分的工作,但当我回去输入一个数字在一个或两个领域的总数没有在该领域的更新。 这是我的jsfiddlehttp://jsfiddle.net/YUza7/2/ 形式 javascript

  • 问题内容: 我正在制作动态表格。一个有值的列表。每个值由一个字符串表示。 我的组件中有一个函数,可以向该字段添加新值。 值和按钮在我的HTML中这样显示。 一旦我在值的输入中写入一些文本,输入就会失去焦点。如果我在一个字段中添加了多个值,并且在一个输入值中写入了一个字符,则该输入将失去焦点,并且该字符将写入每个输入中。 问题答案: 当数组是原始类型(在您的情况下是数组)时,会发生这种情况。这可以通

  • 问题内容: 我的扩展程序具有一个包含项目的上下文菜单。我想要做的是:右键单击html元素(例如,输入或文本区域),然后选择并单击菜单中的某个项目时- 由扩展名定义的某些值将输入到输入中。 目前,我已经意识到。 简单的输入就可以了。 当存在具有自定义事件处理的输入(例如日历或电话输入或货币输入)时,问题就开始了,这些输入以某种方式转换了用户输入。 由于我直接在元素上设置了一个值-省略了处理逻辑,这会

  • 我有三个输入,我想添加,当我把我的第一个数字"5"console.log显示"0"下一个输入字段我输入"2"这将console.log第一个输入字段的数字"5"第三个我输入我在“7”console.log看到的“5”。 为什么会发生这种情况,我该如何解决它。 JavaScript.

  • 创建一个在PHP服务器端无法理解的小管理员行更新程序。我希望sql查询只更新页面上已更改的$u POST字段,这样它就不会循环所有100条左右的记录。 我的做法如下: 1) jQuery侦听已更改的输入字段,然后为已更新的用户字段分配名称属性 2) PHP检测已设置更新的用户字段。 3) 在提交重新加载时,PHP检测到该输入,并按行ID更新SQL。如何确保PHP知道哪个输入字段指向哪个行ID? j