Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 需要在pygame中输入文本/按钮_Python_User Interface_Tkinter_Textbox_Pygame - Fatal编程技术网

Python 需要在pygame中输入文本/按钮

Python 需要在pygame中输入文本/按钮,python,user-interface,tkinter,textbox,pygame,Python,User Interface,Tkinter,Textbox,Pygame,我现在所需要的就是在pygames中输入的基本文本字段和按钮。一个文本字段作为一些简单的结构,我可以读入变量,一个按钮调用函数 首先,我浏览了一下,发现在pygames中创建文本字段并不是一个简单的过程。最终,通过拼凑,我成为了一个有点破碎的文本字段的骄傲的父亲。然后我查看了一下按钮,惊恐地发现实现它们是一件非常困难的事情 PyGame肯定内置了某种按钮模块,对吗?否。 打扰一下?我并不是只为一个按钮编写一个完整的程序,我只是需要一个界面来进行更深入的模拟。就这些 然后我研究了Tkinter,它

我现在所需要的就是在pygames中输入的基本文本字段和按钮。一个文本字段作为一些简单的结构,我可以读入变量,一个按钮调用函数

首先,我浏览了一下,发现在pygames中创建文本字段并不是一个简单的过程。最终,通过拼凑,我成为了一个有点破碎的文本字段的骄傲的父亲。然后我查看了一下按钮,惊恐地发现实现它们是一件非常困难的事情

PyGame肯定内置了某种按钮模块,对吗?否。

打扰一下?我并不是只为一个按钮编写一个完整的程序,我只是需要一个界面来进行更深入的模拟。就这些

然后我研究了Tkinter,它有非常容易理解的GUI输入命令。但不,那也是

我不相信你能将tkinter嵌入pygame。

于是我尝试了PGU,但发现它缺少任何直接的例子来说明如何实际使用它来满足我的需要(简单的文本字段和按钮)。当我试图寻找一个,我发现

Pygame有什么好的、现代的小部件工具包吗?没有。每年都有人制作一个新的Pygame UI库,然后在几个版本后放弃它

如果这是真的,那么人们应该如何用这种语言来完成任何事情呢?在pygame环境中,简单文本字段和简单按钮的最佳实践是什么?

是的-pygame是赤裸裸的“我们控制像素”-已经存在了很多时间,而且它本身看起来已经被抛弃了很多时间(例如,它将在2016年末在Python 3上安装clean)。所以,与此同时,皮加梅看起来被遗弃了,人们搬走了

目前,您必须从这里找到一个可用的工具包:

正如您所注意到的,这里列出的PGU工具包似乎非常完整——关于如何构建与现有Pygame代码库交互的简单小部件的条形示例。所有的例子都假设一个人想要一个用于表单填充的标准gui应用程序,我同意这是非常不合适的:如果一个人想要这种应用程序,只需使用Tkiner、Qt或创建一个web应用程序

然而,事实证明,在现有的pygame窗口中使用独立的小部件非常简单。尽管所有库示例都调用了
.run
方法(这是扰流板的一部分),但由于您调用了
run
,PGU应用程序将接管,并且没有办法运行您的代码,请保存回调。然而,
run
方法本身包含一个非常简单的无限循环,调用应用程序的
loop
方法。您只需在自己的pygame循环的所有帧中调用
app.loop
,并让小部件工作即可

但是,它会吞下pygame事件-如果您想在显示小部件时处理事件,则应将所有事件发送到
app.event
并调用
app.update
,而不是调用
app.loop
。当您查看应用程序类的源代码时,它就变得微不足道了

因此,使用文本输入的完整示例可以是:

import pygame
from pgu import gui

SIZE = W, H = 800, 600


def bouncing_rect(screen):
    surf = pygame.Surface((50, 50))
    rect = surf.get_rect()
    surf.fill((255, 0, 0))
    vx, vy = 10, 10
    while True:
        screen.blit(surf, rect)
        new_surface = yield rect
        if new_surface:
            surf = new_surface
            rect.width = surf.get_width()
            rect.height = surf.get_height()
        rect.x += vx
        rect.y += vy

        if rect.right > W or rect.left < 0:
            vx = -vx
            rect.x += vx * 2
        if rect.bottom > H or rect.top < 0:
            vy = -vy
            rect.y += vy * 2

def main():
    screen = pygame.display.set_mode((SIZE))
    app = gui.Desktop()
    txt = gui.Input()
    app.init(widget=txt, screen=screen, area=pygame.Rect(50, 50, 200,25))
    bouncing = bouncing_rect(screen)
    previous_value = ""
    font = pygame.font.SysFont(name="Sans", size=30)

    while True:
        screen.fill((0,0,0))
        rect = next(bouncing)
        app.loop()
        if txt.value != previous_value:
            previous_value = txt.value
            rect = bouncing.send(font.render(txt.value, True, (255, 255, 0)))
        pygame.display.update([rect])
        app.repaint()
        pygame.display.flip()
        pygame.time.delay(30)

try:
    main()
finally:
    pygame.quit()
导入pygame
从pgu导入gui
尺寸=W,H=800600
def弹跳(屏幕):
surf=pygame.Surface((50,50))
rect=surf.get_rect()
表面填充((255,0,0))
vx,vy=10,10
尽管如此:
屏幕。blit(冲浪,直击)
新曲面=屈服矩形
如果是新曲面:
surf=新曲面
rect.width=surf.get_width()
rect.height=surf.get_height()
矩形x+=vx
矩形y+=vy
如果rect.right>W或rect.left<0:
vx=-vx
矩形x+=vx*2
如果rect.bottom>H或rect.top<0:
vy=-vy
矩形y+=vy*2
def main():
screen=pygame.display.set_模式((大小))
app=gui.Desktop()
txt=gui.Input()
app.init(widget=txt,screen=screen,area=pygame.Rect(50,50200,25))
反弹=反弹(屏幕)
上一个_值=“”
font=pygame.font.SysFont(name=“Sans”,size=30)
尽管如此:
屏幕填充((0,0,0))
rect=下一个(反弹)
app.loop()
如果txt.value!=以前的_值:
上一个_值=txt.value
rect=bouncing.send(font.render(txt.value,True,(255,255,0)))
pygame.display.update([rect])
app.repaint()
pygame.display.flip()
pygame。时间。延迟(30)
尝试:
main()
最后:
pygame.quit()

(我只是使用“send”方法将弹跳对象作为生成器函数,因为这种模式的示例很少,但它可能是一个完全相同的类——如果它是一个普通的pygame.Sprite子类,我会调用“update”而不是使用next/send。)

我投票结束了这个问题,因为它太宽泛了。基本上,您需要的是关于实现或使用pygame GUI工具包的教程。要求我们推荐图书馆也是离题的。像这样的论坛限制较少。如果你想听听我的意见,去图书馆看看。我认为这是你能找到的最容易使用的pygame GUI工具包(不会窃取主循环)。我所要求的只是一个文本字段和一个按钮。这仍然是相当广泛的,而且已经有关于按钮和输入框的问题,所以这个问题将是重复的(听起来也有点像咆哮(我知道开始时可能会很麻烦))。你真正需要的是一个教程,但我不确定是否有。你可以研究这些例子,阅读源代码并进行实验(我就是这么做的)。我确实看到了你链接的gui文章,我在这里问这个问题的原因是因为这篇文章从来都不清楚哪个gui工具包有我想要的简单文本字段和按钮