这位用户正在尝试创建一个GUI来模拟网球比赛,并对其中用于创建和更新GUI控件的代码感到不满意。用户认为当前的代码冗长且可读性差,希望寻找一种更好的方法来组织和管理控件。
解决方案:
-
使用
**tkinter.Label()**
来创建所有标签:for row in range(1, 4): for column in range(3): label = tk.Label(self, text="Set {0}".format(row), height=2, width=6, relief=tk.RAISED) label.grid(row=row, column=column)
-
使用
**tkinter.Button()**
来创建所有按钮:for row in range(3): button = tk.Button(self, text="Button {0}".format(row), command=lambda: self.button_clicked(row)) button.grid(row=row, column=3)
-
使用
**tkinter.StringVar()**
来存储控件的值:self.player_1_name = tk.StringVar() self.player_2_name = tk.StringVar() self.score_player_1 = tk.StringVar() self.score_player_2 = tk.StringVar()
-
使用
**label.config()**
来更新控件:self.player_1_name_label.config(textvariable=self.player_1_name) self.player_2_name_label.config(textvariable=self.player_2_name) self.score_player_1_label.config(textvariable=self.score_player_1) self.score_player_2_label.config(textvariable=self.score_player_2)
-
使用
**self.update()**
来更新GUI:self.update()
改进了的代码:
class TennisScoreboard(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.create_widgets()
def create_widgets(self):
# Labels
self.player_1_name_label = tk.Label(self, text="Player 1")
self.player_1_name_label.grid(row=0, column=0)
self.player_2_name_label = tk.Label(self, text="Player 2")
self.player_2_name_label.grid(row=0, column=2)
self.score_player_1_label = tk.Label(self, text="Score")
self.score_player_1_label.grid(row=1, column=0)
self.score_player_2_label = tk.Label(self, text="Score")
self.score_player_2_label.grid(row=1, column=2)
# Buttons
self.play_button = tk.Button(self, text="Play")
self.play_button.grid(row=2, column=0)
self.pause_button = tk.Button(self, text="Pause")
self.pause_button.grid(row=2, column=1)
self.restart_button = tk.Button(self, text="Restart")
self.restart_button.grid(row=2, column=2)
# StringVar variables
self.player_1_name = tk.StringVar()
self.player_2_name = tk.StringVar()
self.score_player_1 = tk.StringVar()
self.score_player_2 = tk.StringVar()
# Update the labels with the StringVar variables
self.player_1_name_label.config(textvariable=self.player_1_name)
self.player_2_name_label.config(textvariable=self.player_2_name)
self.score_player_1_label.config(textvariable=self.score_player_1)
self.score_player_2_label.config(textvariable=self.score_player_2)
def update_widgets(self):
# Update the StringVar variables with the current score
self.player_1_name.set("Player 1")
self.player_2_name.set("Player 2")
self.score_player_1.set("0")
self.score_player_2.set("0")
# Update the GUI
self.update()
if __name__ == "__main__":
root = tk.Tk()
scoreboard = TennisScoreboard(root)
scoreboard.pack()
root.mainloop()
使用此方法,用户可以更轻松地创建、更新和管理GUI控件,从而提高代码的可读性和可维护性。