Message Box替代方案,包含许多自定义选项

时间:2017-10-26 15:40:12

标签: python tkinter toplevel

我目前正在从事大学任务。我创建了一个主窗口,其中包含游戏所在的App类。在初始化此App类之前,我想打开另一个窗口,其中包含“BASIC”,“ADVANCED”等自定义按钮。但是,目前我只能使用YES / NO或YES / NO /创建messagebox取消等

messagebox是否有允许自定义按钮的变体?从这些按钮我想要返回一个变量gamemode或类似的东西,其值为“BASIC”或“ADVANCED”等字符串返回App.__init__()

到目前为止,这是我的代码。

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()

1 个答案:

答案 0 :(得分:1)

messagebox用于向用户显示消息,警告等,或提供yes / no / cancel / abort之间的选择。你要找的是Radiobutton

每个Radiobutton都有一个值,并且与获取该值的变量相关联。当您将许多此类按钮组合到同一个变量时,您将获得一个多选项。

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

正如Bryan Oakley评论的那样,虽然你可以打开一个辅助窗口,但你不需要。您可以使用根窗口显示选项,一旦用户做出选择,您可以将radiobuttons替换为程序的主要部分。如果需要,您可以显示弹出窗口,但这不是唯一的解决方案。

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()