当前位置: 首页 > 知识库问答 >
问题:

在使用Messagebox(或它的替代方案)时避免有多个窗口的方法?

佴淮晨
2023-03-14

我正在尝试用Tkinter编写我的第一个基于GUI的python程序。我已经创建了一个基本窗口,它持有菜单栏和几个选项。

其中一个选项是一个标准的“about”框。当我用

helpMainMenu.add_command(label="About", command=self.aboutProgram)

它打开消息框,但在一个新窗口中,因此现在任务栏上显示了两个窗口。有没有办法阻止它打开一个新窗口而使用主窗口代替,或者有没有更好的办法来做这件事?

null

#! /usr/bin/python3
from tkinter import *
from tkinter import messagebox
import datetime

timeNow = datetime.datetime.now()
writeYear = 2020 # Enter the year you started writing the program
lineFeed = "\n"
programTitle = "Basic Menu"
programVersion = "Version 1.0.0"
programmerName = " Name (email@gmail.com)"
if timeNow.year > writeYear:
    programAuthor = "©" + str(writeYear) + "-" + str(timeNow.year) + programmerName
else:
    programAuthor = "©" + str(writeYear) + programmerName
aboutMessage = programTitle + lineFeed + programVersion + lineFeed + programAuthor
class Window(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)   
        self.master = master
        self.init_window()

    def init_window(self):
        self.master.title("{} ({})".format(programTitle, programVersion))
        self.pack(fill=BOTH, expand=1)
        menu = Menu(self.master)
        self.master.config(menu=menu)

        fileMainMenu = Menu(menu, tearoff=0) #Create the File menu container
        fileMainMenu.add_command(label="Exit", command=self.programExit) # File menu option
        menu.add_cascade(label="File", menu=fileMainMenu)

        helpMainMenu = Menu(menu, tearoff=0) #Create the Help menu container
        helpMainMenu.add_command(label="About", command=self.aboutProgram)
        menu.add_cascade(label="Help", menu=helpMainMenu)
    def programExit(self):
        exitMsgBox = messagebox.askquestion ("Exit Application","Are you sure you want to exit the application",icon = "warning")
        if exitMsgBox == "yes":
            root.destroy()
            exit()
    def aboutProgram(self):
        messagebox.showinfo("About","About the application", icon = "info")

root = Tk() # root window created. Here, that would be the only window, but
windowHeight = int(root.winfo_screenheight()/100*75) # Set the main window height to 75% of the screen height
windowWidth = int(root.winfo_screenwidth()/100*75) # Set the main window width to 75% of the screen width

screenWidth = int(root.winfo_screenwidth())
screenHeight = int(root.winfo_screenheight())
positionRight = int(root.winfo_screenwidth()/2 - windowWidth/2) # Get the screen width and divide by 2, then minus the result of 'windowWidth' divided by 2
positionDown = int(root.winfo_screenheight()/2 - windowHeight/2) # Get the screen height and divide by 2, then minus the result of 'windowHeight' divided by 2
root.geometry("{}x{}+{}+{}".format(windowWidth, windowHeight, positionRight, positionDown)) # Positions the window in the center of the page.

app = Window(root)
root.mainloop()

null

null

共有1个答案

柴良哲
2023-03-14

最简单的方法是为“about”页面创建一个新框架,然后用 将其覆盖在主窗口的顶部--这是 优于 的少数情况之一。

您还应该对框架进行“抓取”,以便所有事件都漏斗到框架及其子框架。通过抓取,虽然弹出窗口是可见的,但您不能与主窗口上的小部件进行交互。

下面是一个简单的例子:

def aboutProgram(self):
    # create the frame with a message and a button
    # which destroys the window
    aboutFrame = Frame(self.master, bd=2, relief="groove")
    label = Label(aboutFrame, text="About the application...")
    button = Button(aboutFrame, text="Ok", command=aboutFrame.destroy)
    label.pack(side="top", padx=20, pady=20)
    button.pack(side="bottom", pady=20)

    # overlay the "about" page on top of the root window
    aboutFrame.place(relx=.5, rely=.5, anchor="c")

    # force all events to go to the popup
    aboutFrame.grab_set()

如果要完全隐藏主窗口的内容,可以更改 参数以填充窗口:

aboutFrame.place(x=0, y=0, anchor="nw", relwidth=1.0, relheight=1.0)
 类似资料:
  • 问题内容: 我正在测试一个重载的视频,该视频在Thread.sleep(1000)之后加载;它播放第二个视频。但是一旦我一次又一次地循环播放,它就会冻结。 当我删除所有那些Thread.sleep(1000); 它完美地工作而没有冻结。 但是我需要延迟(但不要使用Thread.sleep方法),我们该怎么做? 问题答案: 如果您正在调用事件处理线程,则可以,在此期间,GUI将冻结。一个更好的主意是

  • 需求是再页面内打开一个弹窗然后显示外部页面。 但是外部页面都是http 无法使用

  • 我写了一个相当基本的js函数,它以编程方式自动将iPhone键盘完美地对准每一个聚焦的输入字段(如果你喜欢,可以随意使用它!)。对齐主要由window.scroll处理——这是一种标准方法,适用于任何浏览器视图,UIWebView除外,因此是phonegap/cordova(2.1)。所以我需要一个变通方法。 我的工作代码: 工作在一切,但UIWebView,这是。正如我上面提到的,除了windo

  • 我正在阅读下面Joe Albahari优秀的“C9简而言之”的摘录,并试图理解这里用粗体描述的内容。有人能用我更能理解的方式解释替代方法吗?出于某种原因,这对我来说似乎有些落后。

  • 我目前使用的是JsonPath(0.8.0版本,这是我能找到的最新版本),这基本上正是我要寻找的,但是我得到了如下所示的异常。我只是使用JsonPath google代码页上给出的示例JSON,使用他们的示例查询之一。 我在这里做错了什么?或者,如果没有解决方案,那么Java中是否有JsonPath的替代方案?我希望能够以字符串的形式传递整个查询,而且必须是Java的。 功能: 例外情况: 实践J

  • 问题内容: 出于各种原因,在编写 Java应用程序时 ,调用会被皱眉,所以如何通知调用过程并非一切都按计划进行? 编辑: 1是任何非零退出代码的。 问题答案: 当“应用程序”实际上是较大的Java应用程序(服务器)的子应用程序(例如servlet,applet)时,对的使用会被拒绝:在这种情况下,它可能会停止JVM并因此停止所有其他子应用程序。在这种情况下,抛出适当的异常(最好由应用程序框架/服务