我正在用Tkinter编写一个connect-4游戏,我想在游戏过程中向用户呈现几个菜单选项。
问题是菜单倾向于一起显示,如下面的代码片段所示。例如,在present_player_choice()中,我想要显示playerA的菜单,获得答案,然后显示playerB的菜单。这在这里并不是那么关键,但这是我经常遇到的问题。
after()似乎不是答案,因为我不希望菜单在一段时间后消失,而是在用户提交答案后消失。
此外:在为菜单编写“确定”按钮时,我使用了“退出”。但是quit会关闭整个窗口小部件!我想让gui继续,只是关闭菜单,而不是整个GUI!
我知道这些问题听起来很愚蠢,但我已经在这个问题上工作了一段时间,真的很困惑。提前感谢您的帮助。
from tkinter import *
class GUI:
def __init__(self, root):
self.__root = root
self.__player_A = None
self.__player_B = None
def assign_player(self, player, identity):
if player == "player A":
self.__player_A = identity
elif player == "player B":
self.__player_B = identity
print("Player A is: " + str(self.__player_A))
print("Player B is: " + str(self.__player_B))
def present_player_choice(self):
self.ask_choose_player("player A")
self.ask_choose_player("player B")
Button(self.__root, text="OK", command=quit).pack(anchor=W)
def ask_choose_player(self, player):
Label(self.__root, text="Who would you like to play " + player + "?").pack(anchor=W)
var = IntVar()
Radiobutton(self.__root, text="human", variable=var,
command=lambda:self.assign_player(player, HUMAN), value=1).pack(anchor=W)
Radiobutton(self.__root, text="computer", variable=var,
command=lambda:self.assign_player(player, COMPUTER), value=2).pack(anchor=W)
if __name__ == '__main__':
root = Tk()
gui = GUI(root)
gui.present_player_choice()
mainloop()发布于 2020-02-19 22:18:37
最快的方法是在您的类中添加一个Frame,我们可以使用它来重置内容,然后将对播放器B的调用移到assign_player方法中的一个条件中,以便在选择一个选项时更新播放器B的帧。
您可能还希望将tristatevalue=0添加到单选按钮,以便没有默认选择。
示例:
import tkinter as tk
class GUI:
def __init__(self, root):
self.__root = root
self.__player_A = None
self.__player_B = None
self.frame = None
def assign_player(self, player, identity):
if player == "player A":
self.__player_A = identity
print("Player A is: " + str(self.__player_A))
self.ask_choose_player("player B")
tk.Button(self.__root, text="OK", command=quit).pack(anchor=tk.W)
elif player == "player B":
self.__player_B = identity
print("Player B is: " + str(self.__player_B))
self.frame.destroy()
def present_player_choice(self):
self.ask_choose_player("player A")
def ask_choose_player(self, player):
if self.frame is None:
self.frame = tk.Frame(self.__root)
else:
self.frame.destroy()
self.frame = tk.Frame(self.__root)
self.frame.pack(fill='both', expand=1)
tk.Label(self.frame, text="Who would you like to play " + player + "?").pack(anchor=tk.W)
var = tk.IntVar()
tk.Radiobutton(self.frame, text="human", variable=var, tristatevalue=0,
command=lambda: self.assign_player(player, 'human'), value=1).pack(anchor=tk.W)
tk.Radiobutton(self.frame, text="computer", variable=var, tristatevalue=0,
command=lambda: self.assign_player(player, 'pc'), value=2).pack(anchor=tk.W)
if __name__ == '__main__':
root = tk.Tk()
gui = GUI(root)
gui.present_player_choice()
root.mainloop()选择之前/之后:


https://stackoverflow.com/questions/60301797
复制相似问题