【问题标题】:Tkinter window and pygame window open at same timeTkinter 窗口和 pygame 窗口同时打开
【发布时间】:2021-01-22 02:11:38
【问题描述】:

我正在尝试创建一个打开 tkinter 窗口的程序,然后当您按下按钮时,它会关闭 tkinter 窗口并打开一个 pygame 窗口。但是,当我单击按钮打开 pygame 窗口时,它会打开 pygame 窗口并且 tkinter 窗口保持打开状态。

代码:

import tkinter as tk
import pygame

root = tk.Tk()
btn = tk.Label(root, text="Start")
btn.bind("<Button-1>", lambda x: root.quit())
btn.pack()

root.mainloop()
root.destroy()

win = pygame.display.set_mode((500, 500))
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    win.fill((255, 255, 255))
    pygame.display.update()
pygame.quit()

我也尝试过使用:

btn.bind("<Button-1>", lambda x: root.destroy())
btn.bind("<Button-1>", root.quit)
btn.bind("<Button-1>", root.destroy)
btn.bind("<Button-1>", lambda: root.quit())
btn.bind("<Button-1>", lambda: root.destroy())
def start(event=None):
    root.quit()
btn.bind("<Button-1>", start)

我该如何解决这个问题? (我在 MacOS 11.1 上运行 Python 3.7.7)

【问题讨论】:

  • @Rabbid76 如果this 是你的意思,那么我仍然有同样的问题。当你运行它时,tkinter 窗口是否关闭?
  • 你是什么IDE和操作系统?
  • @Rabbid76 PyCharm CE 2019.3.3,就像我说的,macOS 11.1
  • 那我该如何解决这个问题呢?
  • @Rabbid76 你要回答这个问题吗?

标签: python python-3.x macos tkinter pygame


【解决方案1】:

我无法重现该问题。不过,我建议将 tkinter 窗口用于函数或类。当按键被按下而不是在主循环退出之后调用destroy。如果应用程序已经被销毁,例如手动关闭窗口,调用destroy 命令将导致错误。

import tkinter as tk
import pygame

def runTk():
    root = tk.Tk()
    btn = tk.Label(root, text="Start")
    btn.bind("<Button-1>", lambda x: root.destroy())
    btn.pack()
    root.mainloop()

runTk()

win = pygame.display.set_mode((500, 500))
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    win.fill((255, 255, 255))
    pygame.display.update()
pygame.quit()

【讨论】:

【解决方案2】:

我尝试在一个类中组织您的代码,因此对其进行修改和调用各个组件会更容易一些。

除此之外,我将您的 btn 更改为使用 tk.Button 而不是 tk.Label(认为在上下文中更有意义)

实际的切换函数调用self.tk_root.withdraw() 命令。这有效地隐藏了根 tk 窗口 - 您可以通过调用 self.tk_root.deiconify() 使其再次出现。如果您还想在隐藏根后销毁它,只需在撤销后添加self.tk_root.destroy()即可。

编辑:如果withdraw() 不适合您,请尝试改用iconify()

import tkinter as tk
import pygame


class TkPygame:
    def __init__(self):
        self.tk_root = tk.Tk()

        self.make_tk_widgets()

        self.tk_root.mainloop()

    def make_tk_widgets(self):
        btn = tk.Button(self.tk_root, text='Start', command=self.toggle_to_pygame)
        btn.pack()

    def toggle_to_pygame(self):
        self.tk_root.withdraw()
        self.make_pygame_window()

    def make_pygame_window(self):
        pygame_root = pygame.display.set_mode((500, 500))
        run = True
        while run:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False
            pygame_root.fill((255, 255, 255))
            pygame.display.update()
        pygame.quit()


TkPygame()

【讨论】:

  • 当我运行iconify()withdraw()没有工作)时,窗口被最小化,然后立即unminimized,打开pygame窗口。当我在那之后打电话给self.tk_root.destroy() 时,它什么也没做。有关如何解决此问题的任何想法?
  • 不,抱歉,不知道为什么这对您不起作用,我无法复制该问题。我阅读了更多关于它的内容,这似乎是 OS X 上的一个已知问题,如果不使用 sys.exit() 之类的东西完全关闭 python,就无法销毁/退出根目录
猜你喜欢
  • 2015-09-13
  • 2016-03-06
  • 1970-01-01
  • 2013-09-18
  • 2016-10-08
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
相关资源
最近更新 更多