【问题标题】:I can't link my pygame game to my tkinter GUI我无法将我的 pygame 游戏链接到我的 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 应用

标签: python user-interface tkinter pygame


【解决方案1】:

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

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

  2. 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      • 1970-01-01
      • 2020-08-07
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多