【问题标题】:Message Box alternative with many customized options具有许多自定义选项的消息框替代方案
【发布时间】:2017-10-26 15:40:11
【问题描述】:

我目前正在完成一项大学作业。我创建了一个带有 App 类的主窗口,用于播放游戏。在初始化这个 App 类之前,我想打开另一个带有自定义按钮的窗口,如“BASIC”、“ADVANCED”等。但是,目前我只能创建一个带有 YES/NO 或 YES/NO/CANCEL 的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()

【问题讨论】:

  • “有没有可能”和问题不适合 stackoverflow,因为唯一的答案是“是”或“否”。在这种情况下,答案是“是”。另外,“有什么帮助吗?”简直太宽泛了。您需要更具体,并进行一些研究。这不是一项免费的家庭作业服务。

标签: python tkinter toplevel


【解决方案1】:

messagebox 用于向用户显示消息、警告等,或提供是/否/取消/中止之间的选择。你正在寻找的是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()

【讨论】:

  • 这是一个很好的答案,尽管乍一看它似乎没有回答所问的问题。 OP询问如何将这些按钮放在弹出窗口中。您的回答很好,因为它表明您不需要使用单独的弹出窗口,但没有详细说明该细节。我建议您添加一个段落来解释如何通过首先添加选项,然后销毁选项并用主窗口替换它们来使用相同的主窗口。
  • 嗯,问题中的第二句(此时)以“我想调出另一个窗口”开头
  • @BryanOakley 现在应该解决了。
  • 这不是我的建议,但它肯定有助于将答案与问题联系起来。
  • @BryanOakley 有没有办法改写你的建议,因为我看不出你的意思。我对 OP 第一段的解释是,他想在初始化主窗口之前创建一个弹出窗口,我相信这就是我的回答所提供的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 2020-02-09
  • 1970-01-01
  • 2011-05-12
  • 2017-06-24
  • 2021-08-30
相关资源
最近更新 更多