Python 具有许多自定义选项的消息框备选方案

Python 具有许多自定义选项的消息框备选方案,python,tkinter,toplevel,Python,Tkinter,Toplevel,我目前正在做一项大学作业。我用应用程序类创建了一个主窗口,在那里玩游戏。在初始化这个应用程序类之前,我想打开另一个带有自定义按钮的窗口,如“基本”、“高级”等。但是,目前我只能创建一个带有YES/NO或YES/NO/CANCEL等的messagebox 是否有允许自定义按钮的messagebox变体?通过这些按钮,我想返回一个变量gamemode,或类似的东西,其值为字符串“BASIC”或“ADVANCED”,返回到应用程序 这是到目前为止我的代码 from tkinter import *

我目前正在做一项大学作业。我用
应用程序
类创建了一个主窗口,在那里玩游戏。在初始化这个应用程序类之前,我想打开另一个带有自定义按钮的窗口,如“基本”、“高级”等。但是,目前我只能创建一个带有YES/NO或YES/NO/CANCEL等的
messagebox

是否有允许自定义按钮的
messagebox
变体?通过这些按钮,我想返回一个变量
gamemode
,或类似的东西,其值为字符串“BASIC”或“ADVANCED”,返回到
应用程序

这是到目前为止我的代码

from tkinter import *

class App:
    def __init__(self, master):

        if gamemode = "BASIC"
            'run basic gamemode...'

        elif gamemode = "ADVANCED"
            'run advanced gamemode...'

root = tk.Tk()
app = App(root)
root.mainloop()

messagebox
用于向用户显示消息、警告等,或在是/否/取消/中止之间提供选择。你要找的是

每个单选按钮都有一个值,并绑定到获取该值的变量。当您将多个这样的按钮组合到同一个变量时,您将得到多个选择中的一个

下面是一个简单的示例,其中值是整数(从0开始),以方便使用。如果你坚持使用字符串,这是可以改变的。你所需要的只是一个带有单选按钮的框架和一个启动游戏按钮,它可以读取你的选择并将其传递给你的主应用程序

正如布莱恩·奥克利(Bryan Oakley)所评论的,虽然你可以打开一个辅助窗口,但你不需要。您可以使用根窗口显示选项,一旦用户做出选择,您就可以用程序的主要部分替换单选按钮。如果需要,您可以显示一个弹出窗口,但这不是唯一的解决方案

import tkinter as tk

class StartGameMenuWindow:
    def __init__(self, parent):
        self.parent = parent
        self.frame = tk.Frame(parent)
        self.frame.pack()
        self.menu_value = tk.IntVar()
        self._create_items()

    def _create_items(self):
        modes = ('Basic', 'Advanced')
        for value, mode in enumerate(modes):
            tk.Radiobutton(self.frame,
                           text=mode,
                           variable=self.menu_value,
                           value=value).pack()
        tk.Button(self.frame, text='Start game', command=self.launch).pack()

    def launch(self):
        value = self.menu_value.get()
        self.frame.destroy()
        # Launch your game window with `value` as input

root = tk.Tk()
m = StartGameMenuWindow(root)
tk.mainloop()
如果你真的想要一个弹出窗口

# instead of
self.frame = tk.Frame(parent)
self.frame.pack()

# use this, but make sure to rename `self.frame` everywhere in the class
self.window = tk.Toplevel()

“是否可能”和问题与stackoverflow不太匹配,因为唯一的答案是“是”或“否”。在这种情况下,答案是“是”。还有,“有什么帮助吗?”这个词太宽泛了。你需要更具体一点,展示一些研究成果。这不是一项免费的家庭作业服务。这是一个很好的答案,虽然乍一看它似乎没有回答你的问题。OP询问如何在弹出窗口中放置这些按钮。您的答案很好,因为它表明您不需要使用单独的弹出窗口,但没有详细说明。我建议你添加一段文字,解释如何使用同一个主窗口,首先添加选项,然后销毁选项,并用主窗口替换。问题的第二句(此时)以“我想打开另一个窗口”开头@BryanOakley现在应该解决这个问题。这不是我的建议,但它确实有助于将答案与问题联系起来。@BryanOakley是否有可能改写你的建议,因为我不明白你的意思。我对OP第一段的理解是,他想在主窗口初始化之前创建一个弹出窗口,我相信这就是我的答案。