基本上我已经为我的游戏创建了一个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()
答案 0 :(得分:3)
当您import
第二个模块时,您没有执行if __name__ == "__main__":
部分。 (这就是那个成语的重点 - 提供在你是顶级脚本时运行的代码,但不是在import
编辑时运行。)所以,你永远不会创建Tk应用程序和主事件循环,意思是没有Tk代码可以做任何事情,你的GUI永远不会显示。
但在尝试通过将代码移动到函数并调用它来解决此问题之前,您不能只从tkinter
调用pygame
主事件循环,因为那样{ {1}}循环将被阻止,直到pygame
应用退出。
我认为你在这里的困惑是你混淆了模块,脚本和进程以及其他一些东西,并将它们称为“程序”。有关差异的介绍,请参见下文。
如果你真的想这样做,有几种可能性:
tkinter
可以处理您想要的任何事件循环,只要您正确连接即可。这意味着您可以创建顶级pygame
应用并在其下运行tkinter
代码。pygame
循环,并在另一个主题中运行pygame
循环。pygame
GUI toolkits之一中重新编码tkinter
内容。subprocess
以其他脚本作为其第一个参数启动tkinter
像sys.executable
这样的Python文件可以作为脚本运行,也可以作为模块导入。这些在某些方面类似,在其他方面则不同。
您可以将其作为脚本运行,例如,在您的DOS / bash /任何shell中键入highscore.py
(或在其他程序中使用python highscore.py
之类的内容)。这将启动一个新进程,运行Python解释器,执行subprocess.Popen(sys.executable, 'highscore.py')
中的代码,然后退出。这不会影响任何其他进程,因为您的操作系统知道如何同时运行单独的进程。在执行highscore.py
代码时,highscore.py
设置为__name__
。
通过在正在运行的Python程序中执行"__main__"
将其作为模块导入。这不启动一个新进程,它只是在现有Python程序的中间执行来自import highscore
的代码,然后继续下一行。在执行highscore.py
代码时,highscore.py
设置为__name__
。
无论哪种方式,都将执行所有顶级模块代码,包括定义类和函数,以及您编写的任何其他语句。您可以使用"highscore"
检查来获得在文件作为脚本运行时执行的额外代码,但不能在将其作为模块导入时执行。
值得指出一些事情。你的代码中有这个:
if __name__ == "__main__":
如果这是你真正的缩进, 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()
将永远为真,所以这是不必要的,你无法进入elif e.key == pygame.K_RETURN
,所以没有办法退出。