我正在构建一个允许用户跟踪篮球得分的应用程序。例如,如果一支球队罚球,他们按得分队标题下方的“罚球”按钮,将一个分数加到显示的分数上。我正在使用Python 3.x,想知道我是否可以编写将被指定为home或走远得分变量的函数参数,然后更新指定的得分。目前,对于每个团队的每种得分类型,我都有单独的功能,这意味着我实质上具有重复的代码,减去了“主场”和“客场”之间的差异。由于与其他软件接口的要求,本国得分和客场得分都保存为全局得分。我是否只能使用6个函数,还是可以编写3个函数并仅指定调用该函数时要更新的全局变量?随附示例非工作代码
global away_score
away_score = 0
global home_score
home_score = 0
def plus_one(inc_score, inc_frame):
inc_score += 1
inc_frame.config(text = inc_score) # this is for interfacing with tkinter
答案 0 :(得分:2)
由于您使用的是tkinter
,因此处理此问题的最佳方法可能是利用tkinter变量,在本例中为IntVar
:
import tkinter as tk
root = tk.Tk()
away_score = tk.IntVar(value=0)
home_score = tk.IntVar(value=0)
def plus_one(inc_score, inc_frame):
inc_score.set(inc_score.get()+1)
inc_frame.config(text = inc_score.get())
away_but = tk.Button(root,text=0)
away_but.config(command=lambda: plus_one(away_score,away_but))
away_but.pack()
root.mainloop()
答案 1 :(得分:1)
最好不要使用全局变量,而将代码重构为使用局部变量和字典或对象来存储分数。但是对于您的问题,您可以这样写:
away_score = 0
home_score = 0
def plus_one(inc_frame, add_to_away: bool = False):
global home_score
global away_score
if add_to_away:
away_score += 1
inc_score = away_score
else:
home_score += 1
inc_score = home_score
# inc_frame.config(text = inc_score) # this is for interfacing with tkinter
if __name__ == '__main__':
plus_one(None, add_to_away=False)
print(f"home: {home_score}, away: {away_score}")
plus_one(None, add_to_away=True)
print(f"home: {home_score}, away: {away_score}")
plus_one(None, add_to_away=True)
print(f"home: {home_score}, away: {away_score}")
答案 2 :(得分:0)
虽然您可以 通过名称修改全局变量,但这通常不是您应该做的事情。
但是,如果您确实需要使这些变量成为全局变量(例如,a dictionary或properties of a class中的条目不是)和,则您确实不想编写多个更新功能,有解决方案。
根据this answer,您可以修改globals
返回的字典,以更新模块名称空间。
some_variable = None
def update(var, value):
globals()[var] = value
update('some_variable', 'some value')
print(some_variable) # Output: "some value"
但是,如果有可能,您应该避免这样做-有许多更好的代码编写方法,这也为更多令人兴奋的错误留出了空间。
away_score = 10
update('away_scoer', away_score + 1) # npote the typo
print(away_score) # It's still 10, but there was no error in Python.
update('update', print) # now updating prints instead
update('away_score', 11) # Prints "away_score 11"
print(away_score) # still 10
update('print', function_that_melts_your_computer) # probably a bad idea
它还具有一些普通的缺点,例如使您的编辑器不满意以及在某些地方破坏了代码完成。