我无法将我的 pygame 游戏链接到我的 tkinter GUI

Posted

技术标签:

【中文标题】我无法将我的 pygame 游戏链接到我的 tkinter GUI【英文标题】:I can't link my pygame game to my tkinter GUI 【发布时间】:2013-02-17 02:36:52 【问题描述】:

基本上我已经为我的游戏创建了一个 pygame 菜单,当我单击它们时它会加载所有其他 pygame 窗口,但是对于添加用户等某些方面,我是在 Tkinter GUI 中创建的。当我在我的 pygame 上单击加载它们时,它不会加载 Tkinter GUI,有谁知道我该如何解决这个问题,或者是否需要添加一些东西才能使其工作。

它好像要加载一些东西但没有加载,第一个名为“mathsvaders”的加载很好,因为它是一个 pygame 程序,但高分在 tkinter 中并且不加载:

pos = 1
while True:
# events
for e in pygame.event.get():
    if e.type == pygame.QUIT:
        pygame.quit()
        sys.exit()
    elif e.type == pygame.KEYDOWN:
        if e.key == pygame.K_DOWN:
            pos += 1
            if pos > 5:
                pos = 1
        elif e.key == pygame.K_UP:
            pos -= 1
            if pos < 1:
                pos = 5
        elif e.key == pygame.K_RETURN:
            if pos == 1:
                import MathsvadersReal
            elif e.key == pygame.K_RETURN:
             if pos == 2:
                import Highscore
            elif pos == 5:
             pygame.quit()
             sys.exit()

表单代码如下:

import Tkinter import Databaseconnector

 class simpleapp_tk(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent) 
        self.parent = parent
        self.initialize()

    def initialize(self):
      def create_widgets(self):
        # create welcome label
        label1 = Tkinter.Label(self, text = "Hello world")
        label1.grid(row = 0, column = 2, columnspan = 4, sticky = 'E')

if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.title('my application')
    app.geometry("250x200")
    app.mainloop()                              

【问题讨论】:

只是一个提示,如果你需要别人的帮助,你应该展示代码示例。 它好像要加载一些东西但没有加载,第一个名为“mathsvaders”的加载很好,因为它是一个 pygame 程序,但高分在 tkinter 中并且不加载: 对不起,它的意思是说 pos == 2,但即使这样它也不起作用。 @SmithJr 这个 sn-p 不足以看出问题出在哪里,使用 Tkinter 函数的部分可能会更有帮助。 我不能确定,因为它周围的代码可能会解决这个问题,但是如果你还在 while 循环中,你几乎无法维护一个 tkinter 应用 【参考方案1】:

当你要加载高分时,你的主代码导入了Highscore模块,这有两个问题:

    Highscore 模块中,__name__ 不等于"__main__"。它等于"Highscore"。因此,永远不会创建 simpleapp_tk 应用程序,并且永远不会调用它的 mainloop 方法。 这可能是您遇到的问题,但不是这段代码的唯一问题。

    import 语句将其结果缓存在sys.modules 中,因此此代码只能运行一次。要重新加载模块,您必须通过调用reload(Highscore)del sys.modules["Highscore"] 来明确这样做

【讨论】:

【参考方案2】:

您在这里使用了两个窗口系统,它们都需要定期处理事件。您已将 pygame 设置为主事件处理循环 (while True:...),但它永远不会让 Tk 处理它的事件循环。当您致电app.mainloop 时,它永远不会处理事件。 当 pygame 没有要处理的事件时,它会在 while True 中旋转到此循环的末尾,这是调用 Tk update() 方法以允许 Tk 处理事件的好地方。 如果您的游戏循环阻塞等待事件,您也可以使用计时器。

不过,简短的回答是处理两个系统的事件。在 pygame 中,调用 pygame 事件方法之一并定期调用 Tk 更新方法。 例如:

import tkinter as tk
root = tk.Tk()
... other stuff ...
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    ... game code ...
    root.update()

【讨论】:

以上是关于我无法将我的 pygame 游戏链接到我的 tkinter GUI的主要内容,如果未能解决你的问题,请参考以下文章

如何将我的登录屏幕链接到我的主屏幕 SwiftUI

Google Play 服务在我的 Android 游戏中无法正常运行

我需要将哪些文件链接到我的 xcode 项目(内置游戏制作器)才能使其工作?

正确地将我的按钮链接到我的视图(在 UINavigationController 中)?

Pygame,角色移动速度

使用 otest 调试测试时,如何将我的可执行文件链接到我的测试包?