有什么我需要知道一起使用Tkinter和pygame吗?

时间:2011-11-28 03:39:22

标签: python tkinter pygame

我正在使用pygame编写程序,我需要一些GUI配置文本字段和按钮进行控制。我已经使用pygame制作了按钮,但我只能用pygame写一个文本字段。也许我需要将tkinter和pygame一起使用。

我认为如果没有办法在一个窗口中将pygame part和tkinter部分组合在一起,那么我可以把它们放到两个单独的窗口中。

我希望tkinter部分可以更新我的pygame部分中的全局变量,如果有任何问题会有吗?我可以从pygame部分创建一个tkinter的子进程,这样tkinter部分就可以“看到”pygame部分中的全局变量并修改它们。

我可以这样做吗?有没有陷阱?

3 个答案:

答案 0 :(得分:8)

Tkinter和Pygame都有自己的事件循环,所以做你想做的事情远非简单。问题是Pygame想要控制屏幕和用户输入计算机的事件。这对于GUI库也不适用,GUI库也希望“处于控制之中”。

我建议坚持使用Pygame,它有一些很好的GUI工具包,可以帮助你创建按钮和其他控件。过去this page - 它应该清除一切。您可能还会发现this discussion有用。

除了实际方面之外,使用Pygame创建的GUI也比使用Tkinter更适合游戏,因为游戏通常具有原始的,主题的用户界面而不是平淡的“文本框+按钮”窗口我们'习惯于在其他应用程序中使用。

看一下Pygame wiki上的一些示例游戏,很多都有GUI,你可以借用它们的想法和代码。

答案 1 :(得分:2)

    from tkinter import *
    import pygame
    import random
    import os
    global playing
    playing=False
    def playpause():
        global playing
        if playing==True:
            playing=False
        else:
            playing=True
    root = Tk()
    embed = Frame(root, width=640, height=480)
    embed.grid(row=0,column=2)
    playpausebutton=Button(root, command=playpause, text="Play/Pause")
    playpausebutton.grid(row=1,column=2)
    root.update()
    os.environ['SDL_WINDOWID'] = str(embed.winfo_id())
    os.environ['SDL_VIDEODRIVER'] = 'windib'
    pygame.display.init()
    screen = pygame.display.set_mode((640,480))
    pygame.display.flip()
    while True:
        #your code here
        if playing: 
                screen.fill((random.randint(0,255),random.randint(0,255),random.randint(0,255)))
        pygame.display.flip()
        root.update()

这很有效,我在多种情况下成功使用了这种方法。

答案 2 :(得分:0)

我也发现pgu太可怕了。但是,你对tkinter事件循环控制的说法是错误的。你只需要调用root.update而不是mainloop,这可以进入while循环来替换mainloop。然而,回答你的主要问题,你应该注意一些事情。似乎每当我将两个程序并排运行时,就会发生这种回溯:

TclError:预期的布尔值,但得到“-1”

致命的Python错误:( pygame降落伞)分段错误

此应用程序已请求Runtime以不寻常的方式终止它。 请联系应用程序的支持团队以获取更多信息。

因为这样我会避免这种组合,虽然我怀疑这个特殊问题可能与我使用线程有关。

相关问题