首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在tkinter中显示菜单

在tkinter中显示菜单
EN

Stack Overflow用户
提问于 2020-02-19 21:45:58
回答 1查看 47关注 0票数 1

我正在用Tkinter编写一个connect-4游戏,我想在游戏过程中向用户呈现几个菜单选项。

问题是菜单倾向于一起显示,如下面的代码片段所示。例如,在present_player_choice()中,我想要显示playerA的菜单,获得答案,然后显示playerB的菜单。这在这里并不是那么关键,但这是我经常遇到的问题。

after()似乎不是答案,因为我不希望菜单在一段时间后消失,而是在用户提交答案后消失。

此外:在为菜单编写“确定”按钮时,我使用了“退出”。但是quit会关闭整个窗口小部件!我想让gui继续,只是关闭菜单,而不是整个GUI!

我知道这些问题听起来很愚蠢,但我已经在这个问题上工作了一段时间,真的很困惑。提前感谢您的帮助。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-19 22:18:37

最快的方法是在您的类中添加一个Frame,我们可以使用它来重置内容,然后将对播放器B的调用移到assign_player方法中的一个条件中,以便在选择一个选项时更新播放器B的帧。

您可能还希望将tristatevalue=0添加到单选按钮,以便没有默认选择。

示例:

代码语言:javascript
复制
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()

选择之前/之后:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60301797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档