我正在使用pygame编写程序,我需要一些GUI配置文本字段和按钮进行控制。我已经使用pygame制作了按钮,但我只能用pygame写一个文本字段。也许我需要将tkinter和pygame一起使用。
我认为如果没有办法在一个窗口中将pygame part和tkinter部分组合在一起,那么我可以把它们放到两个单独的窗口中。
我希望tkinter部分可以更新我的pygame部分中的全局变量,如果有任何问题会有吗?我可以从pygame部分创建一个tkinter的子进程,这样tkinter部分就可以“看到”pygame部分中的全局变量并修改它们。
我可以这样做吗?有没有陷阱?
答案 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以不寻常的方式终止它。 请联系应用程序的支持团队以获取更多信息。
因为这样我会避免这种组合,虽然我怀疑这个特殊问题可能与我使用线程有关。