gpt4 book ai didi

python-3.x - 如何确保 tkinter 中不跳过 "bind"顺序?

转载 作者:行者123 更新时间:2023-12-03 12:50:26 25 4
gpt4 key购买 nike

我正在尝试使用 tkinter 创建一个游戏,其中玩家将他们的名字输入到一个条目小部件中。

输入他们的名字后,用户应该按下回车键来调用函数“player_names”,这将理想情况下将玩家名字保存在一个列表中,删除条目小部件中的文本,然后继续下一个循环(即玩家)。

该脚本似乎忽略了绑定(bind)并直接移动到“self.name_entry.destroy()”行。如何确保脚本在继续之前等待命令?

def initialise_game(self, num_of_players):

self.players_list = []
for i in range(num_of_players):
player_num = i+1
self.name_label = tk.Label(self.bg_label, text='What is the name'
' of Player ' + str(player_num) + '?')
self.name_label.grid(row=0, padx=200, pady=120)

self.name_entry = tk.Entry(self.bg_label)
self.name_entry.grid(row=1, padx=200, pady=0)
self.name_entry.bind('<Return>', self.player_names)

self.name_entry.destroy()


def player_names(self, event):
self.players_list.append(self.name_entry.get())
self.name_entry.delete(0, 'end')

最佳答案

Entry不像 input()它不会停止代码并等到您输入文本并按 Enter 键。 GUI创建 Entry它在 Entry 之后执行代码立刻。你有 bind分配将在您按 Enter 时执行的函数,该函数应从 Entry 中获取值,并替换小部件(或仅标签中的文本)。它还应该删除 Entry在最后一个玩家之后,所以你必须计算函数执行了多少次(或者你已经有多少玩家 - self.player_num)

我没有测试这段代码,但它应该可以工作。

def initialise_game(self, num_of_players):

self.players_list = []

# remeber values in class variables, not local one
self.num_of_players = num_of_players
self.player_num = 0

# create only one Label - and change text in it
self.name_label = tk.Label(self.bg_label,
self.name_label.grid(row=0, padx=200, pady=120)

# create only one Entry and assign function `self.player_names`
self.name_entry = tk.Entry(self.bg_label)
self.name_entry.grid(row=1, padx=200, pady=0)
self.name_entry.bind('<Return>', self.player_names)

# set text for first player
self.player_num += 1
self.name_label["text"] = 'What is the name of Player {} ?'.format(player_num)

def player_names(self, event):

# get player's name from Entry
self.players_list.append(self.name_entry.get())
self.name_entry.delete(0, 'end')

# set text for next player or destroy Entry after last player
self.player_num += 1
if self.player_num <= self.num_of_players:
self.name_label["text"] = 'What is the name of Player {} ?'.format(player_num)
else:
self.name_label.destroy()
self.name_entry.destroy()

它在其他 GUI(不仅在 tkinter 中)和其他语言(不仅在 Python 中)中的工作方式相同

关于python-3.x - 如何确保 tkinter 中不跳过 "bind"顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55883461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com