繁体   English   中英

Tkinter 按钮绑定到键盘不会计数 Class 参数

[英]Tkinter Button Binded to Keyboard Won't Count Class Parameter

我正在尝试创建 function 'count',它以变量的形式接收 integer,并在每次按下返回键时向其添加 1,每次都保存到变量中。

该参数需要保持通用,因为将来这将在多个变量上运行相同的“计数”function,具体取决于按下哪个按钮。

我尝试通过将global messi放在顶部来使messi成为全局变量,但是会出现同样的问题。

import tkinter as tk

class PlayerStats:
    def __init__(self, name, touches):
        team = "Barcelona"
        self.name = name
        self.touches = touches
        
    def count(number):
        number = number + 1
        print(number)

messi = PlayerStats("Messi",0)

root = tk.Tk()
root.bind('<Return>', lambda event :PlayerStats.count(messi.touches))
root.mainloop()

当我运行这个片段时,它会从 0 到 1 迭代一次,然后重置总是打印出 1。

任何关于为什么会发生这种情况以及如何解决的想法将不胜感激!

您没有保存操作的结果。

您正在实例化您的PlayerStats class ,其值为touches 然后,该值永远不会在您的代码中发生变化。

当 tkinter 调用您的count方法时,它会增加number但该变量永远不会离开该方法的 scope,因此会被垃圾收集。

要修复它,您应该将 class 更改为类似

import tkinter as tk

class PlayerStats:
    def __init__(self, name, touches):
        team = "Barcelona"
        self.name = name
        self.touches = touches
        
    def count(self):  # the first argument of a method is always a reference to the instance
        self.touches += 1
        print(self.touches)

messi = PlayerStats("Messi", 0)

root = tk.Tk()
root.bind('<Return>', lambda event: messi.count())  # You need to call the method on the instance you created.
root.mainloop()

感谢您的帮助 Dogeek。 我上面的功能代码现在看起来像这样:

import tkinter as tk

class PlayerStats:
    def __init__(self, name, touches):
        team = "Barcelona"
        self.name = name
        self.touches = touches
        
    def count(self, number):
        self.touches += 1
        print(number)

messi = PlayerStats("Messi",0)

root = tk.Tk()
root.bind('<Return>', lambda event :messi.count(messi.touches))
root.mainloop()

但是,这并没有解决的一件事是能够为不同的变量重用 function。 我现在正试图想出一种优雅的方式来做这样的事情: import tkinter as tk

class PlayerStats:
    def __init__(self, name, touches, shots):
        team = "Barcelona"
        self.name = name
        self.touches = touches
        self.shots = shots

    def count(self, number):
        self.number += 1
        print(number)

messi = PlayerStats("Messi",0)

root = tk.Tk()
root.bind('<Return>', lambda event :messi.count(messi.touches))
root.bind('<s>', lambda event :messi.count(messi.shots))
root.mainloop()

其中 number 代表 messi.shots 或 messi.touches 取决于按下的键。 我想在不为每个键重新创建一堆几乎相同的功能的情况下做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM