【发布时间】:2018-08-05 05:58:19
【问题描述】:
每单击一次鼠标左键,self.LEFT_MB_Counter 就会增加,因此值始终在变化。我希望self.LEFT_MB_Counter 中的值显示在输入字段self.left_MB_entry 中,但我无法实现。
如何让输入字段始终更新并显示self.LEFT_MB_Counter 中的当前值?
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
【问题讨论】:
-
这并不像你想象的那样:
root.after(0, MouseCounter().count())。它立即运行MouseCounter().count(),然后安排None在零毫秒内运行。 -
如果您想提供帮助,您应该发布回复并提供解决问题的建议……而不是仅仅试图指出问题所在。
root.after(0, MouseCounter().count()在root.mainloop()之后运行,它正在工作。它调用方法count(),在方法内部有root.after(1, self.count),它会调用自己,所以它会继续运行,这是我想要的功能,所以程序会不断地寻找鼠标点击。它正在替换我的一个 while 循环。如果您想回复,请具体说明要更改的内容和原因。谢谢。 -
"root.after(0, MouseCounter().count() 在 root.mainloop() 之后运行" - 不,它没有。
()aftercount使其立即运行。 -
另一个问题:您希望这会计算系统范围内的所有点击次数,还是仅计算该程序获得焦点时发生的点击次数?
-
仔细阅读该答案。
after(0, foo())立即运行 foo。after(0, foo)安排foo在未来运行。看到不同?然而,这不是主要问题。
标签: python tkinter tkinter-entry