2

我是一个业余程序员。我有一个小(且紧急)的问题。我正在开发一个基于文本(控制台)的冒险游戏,以获得乐趣。在某个时刻,我希望打开一个 pygame 窗口。玩家必须尽快点击窗口。反应时间应该返回到主程序,并且 pygame 窗口应该关闭。然后主程序将继续运行。

我已经为 pygame 窗口编写了脚本,它运行良好。我的主程序也可以正常工作。现在如何从主程序调用 pygame 窗口?

我尝试导入 pygame 脚本,但没有奏效。

谢谢。

这是我的 pygame 脚本:

import pygame, sys, time
from pygame.locals import *

pygame.init()

#Set up window
pygame.event.set_grab(0)
pygame.mouse.set_visible(1)
screen = pygame.display.set_mode((300,200))
shape = screen.convert_alpha()
pygame.display.set_caption("Sniper Alert")

#Colors
WHITE = (255, 255, 255)
BLACK = (0,0,0)
RED = (255, 0, 0)

#Draw on surface object
screen.fill(BLACK)

def alert():
    #Create a font
    font = pygame.font.Font(None,50)

    #Render the text
    text = font.render("Sniper Alert", True, RED)

    #Create a rectangle
    textRect = text.get_rect()

    #Center the rectangle
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery

    #Blit the text
    screen.blit(text, textRect)
    pygame.display.update()

    return press()

def press():
    t0 = time.clock()
    dt = 0

    while time.clock() - t0 < 1.5: 
        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONDOWN:
                dt = time.clock()- t0
                return dt


#Exit
pygame.quit()
sys.exit()

#Run the game loop
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
4

1 回答 1

0

我能想到三种方法。他们来了:

解决方案 1:


这种方式可能是最糟糕的解决方案,也是最难实现的,但让我们把它排除在外。我不建议使用它,但在某些情况下您可能想要使用它。您可以使用线程模块。线程是为这样的多任务处理而设计的,并且会做你想做的事。您可以像这样创建一个新线程:

import threading

def DoSomething(a,b,c):         #this function will be called in the background, simultaneously to the main program
    #do something here

apple = 1
banana = 2
cat = 3
mythread = threading.thread(target=DoSomething,args=(apple,banana,cat))   #defines a thread
mythread.start()   #tells the thread to start running

解决方案 2


一个更好的方法就是将它作为一个不同的程序启动。您可以使用 subprocess 模块来执行此操作,该模块用于运行命令行命令。这将有效地运行程序,就像您在终端的新选项卡中执行它一样(没有新选项卡)。然后,您可以使用 subprocess.comunicate() 使程序能够与您的程序进行通信。我将从这里将 pygame 程序的输入和输出连接到您的主程序。这是一个例子:

import subprocess

input = <insert input>                    #when you run the program and it requires something like a raw_input, this will give it input. You could probably avoid needing to send the pygame program input, because all you really want to do is receive an output from it.

process = subprocess.Popen(["python","<popup filename>"],stdin=subprocess.PIPE,stdout=subprocess.PIPE,shell=False)    #this function is how subprocess runs shell/command prompt commands. On a side note, if you simply want to run a shell command without accessing input or output, just use "subprocess.call(<list of words in command (so ls -a would be ['ls','-a'])>)"
output = process.communicate(input)[0]    #this will return any output the program prints, meaning you can communicate with the program and receive information from it

使用 subprocess 可能是最好的方法。

解决方案 3


最后一个选项,如果你想把它全部放在一个文件中并且不想搞乱线程,那就是在一个while循环中交替两个程序。基本上,您将运行一个从两个程序执行代码的循环。这就是它的工作方式:

while True:           #an infinite loop. it doesn't necessarily have to be infinite.
    #call methods or run code to maintain text based game
    #call methods or run code to maintain pygame window

在我制作的还有一个文本组件的 pygame 游戏中,这对我来说效果很好,但是子进程的方式可能更好......

于 2013-11-23T03:40:19.703 回答