绑定到键盘的Tkinter按钮不会计算类参数

2024-09-27 09:26:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建函数“count”,它以变量的形式接受一个整数,并在每次按下返回键时向其添加1,每次保存到变量

该参数需要保持通用,因为在将来,它将根据按下的按钮对多个变量运行相同的“count”函数

我试图通过将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

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


Tags: 函数nameselfnumber参数defcount整数
2条回答

您没有保存操作的结果

您正在用touches的值0实例化PlayerStats类。 然后,该值在整个代码中不会发生变化

当tkinter调用count方法时,它会增加number,但该变量从未离开该方法的作用域,因此会被垃圾收集

要解决这个问题,您应该将类更改为

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()

但是,这并不能解决一件事,那就是对不同变量重用该函数的能力。我现在正试图想出一种优雅的方式来做这样的事情: 将tkinter作为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()

其中数字表示messi.shots或messi.touch,具体取决于按下的键。我不想为每个键重新创建一堆几乎相同的函数

相关问题 更多 >

    热门问题