-1

我目前正在从事大学作业。App我用玩游戏的类创建了一个主窗口。在初始化这个 App 类之前,我想打开另一个带有自定义按钮的窗口,如“BASIC”、“ADVANCED”等。但是,目前我只能创建一个messagebox带有 YES/NO 或 YES/NO/CANCEL 等的窗口。

是否有任何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()
4

1 回答 1

2

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

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

这是一个简单的示例,为方便起见,其中的值是整数(从 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()
于 2017-10-27T11:42:28.493 回答