我正在做一个游戏,我希望用户能够点击一个按钮,打开文件管理器,并要求他们打开一个游戏保存文件。有一个模块/我怎么能把这个放在我的游戏?如果没有好的图形用户界面的方式,我怎么做一个文本输入的东西(不使用终端)?谢谢!
nc1teljy1#
Pygame是一个低级库,所以它没有你想要的那种内置对话框。你可以创建这样的对话框,但是使用tkinter模块会更快,它是与Python一起发布的,提供了一个到TK GUI库的接口。我建议阅读文档,但是这里有一个函数,它会弹出一个文件选择对话框,然后返回所选的路径:
def prompt_file(): """Create a Tk file dialog and cleanup when finished""" top = tkinter.Tk() top.withdraw() # hide window file_name = tkinter.filedialog.askopenfilename(parent=top) top.destroy() return file_name
下面是一个包含此功能的小示例,按空格键将弹出对话框:
import tkinter import tkinter.filedialog import pygame WIDTH = 640 HEIGHT = 480 FPS = 30 def prompt_file(): """Create a Tk file dialog and cleanup when finished""" top = tkinter.Tk() top.withdraw() # hide window file_name = tkinter.filedialog.askopenfilename(parent=top) top.destroy() return file_name pygame.init() window = pygame.display.set_mode((WIDTH, HEIGHT)) clock = pygame.time.Clock() f = "<No File Selected>" frames = 0 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYUP: if event.key == pygame.K_SPACE: f = prompt_file() # draw surface - fill background window.fill(pygame.color.Color("grey")) ## update title to show filename pygame.display.set_caption(f"Frames: {frames:10}, File: {f}") # show surface pygame.display.update() # limit frames clock.tick(FPS) frames += 1 pygame.quit()
注意:这将暂停你的游戏循环,如帧计数器所示,但由于事件由窗口管理器处理,这应该不是问题。我不知道为什么我需要显式的import tkinter.filedialog,但如果我不这样做,我会得到一个AttributeError。至于pygame中的字符串输入,你可能想在本地完成,在这种情况下,你需要处理字母键的KEYUP事件来构建字符串,当用户按下Enter键或你自己的draw按钮时,你可能会完成。你可以继续tk路径,在这种情况下,你会想使用tkinter. simpledalog.askstring(...)
import tkinter.filedialog
AttributeError
KEYUP
zphenhs42#
可以使用pygame_gui模块创建一个文件对话框(尽管不使用本机文件资源管理器)。只需创建一个UIFileDialog示例,并在用户点击“ok”时获取路径:
file_selection = UIFileDialog(rect=Rect(0, 0, 300, 300), manager=manager, initial_file_path='C:\\') if event.ui_element == file_selection.ok_button: file_path = file_selection.current_file_path
如果您希望允许选择目录,请将allow_picking_directories设置为True,但请注意,它不允许选择initial_file_path。
allow_picking_directories
True
initial_file_path
file_selection = UIFileDialog(rect=Rect(0, 0, 300, 300), manager=manager, allow_picking_directories=True)
下面是一个简单程序中的上述代码,该程序允许您在单击按钮时选择一个文件:
#!/usr/bin/env python import pygame import pygame_gui from pygame_gui.windows.ui_file_dialog import UIFileDialog from pygame_gui.elements.ui_button import UIButton from pygame.rect import Rect pygame.init() window_surface = pygame.display.set_mode((800, 600)) background = pygame.Surface((800, 600)) background.fill(pygame.Color('#000000')) manager = pygame_gui.UIManager((800, 600)) clock = pygame.time.Clock() file_selection_button = UIButton(relative_rect=Rect(350, 250, 100, 100), manager=manager, text='Select File') while 1: time_delta = clock.tick(60) / 1000.0 for event in pygame.event.get(): if event.type == pygame.QUIT: quit() if event.type == pygame.USEREVENT: if event.user_type == pygame_gui.UI_BUTTON_PRESSED: if event.ui_element == file_selection_button: file_selection = UIFileDialog(rect=Rect(0, 0, 300, 300), manager=manager, allow_picking_directories=True) if event.ui_element == file_selection.ok_button: print(file_selection.current_file_path) manager.process_events(event) manager.update(time_delta) window_surface.blit(background, (0, 0)) manager.draw_ui(window_surface) pygame.display.update()
2条答案
按热度按时间nc1teljy1#
Pygame是一个低级库,所以它没有你想要的那种内置对话框。你可以创建这样的对话框,但是使用tkinter模块会更快,它是与Python一起发布的,提供了一个到TK GUI库的接口。我建议阅读文档,但是这里有一个函数,它会弹出一个文件选择对话框,然后返回所选的路径:
下面是一个包含此功能的小示例,按空格键将弹出对话框:
注意:这将暂停你的游戏循环,如帧计数器所示,但由于事件由窗口管理器处理,这应该不是问题。我不知道为什么我需要显式的
import tkinter.filedialog
,但如果我不这样做,我会得到一个AttributeError
。至于pygame中的字符串输入,你可能想在本地完成,在这种情况下,你需要处理字母键的
KEYUP
事件来构建字符串,当用户按下Enter键或你自己的draw按钮时,你可能会完成。你可以继续tk路径,在这种情况下,你会想使用tkinter. simpledalog.askstring(...)zphenhs42#
可以使用pygame_gui模块创建一个文件对话框(尽管不使用本机文件资源管理器)。
只需创建一个UIFileDialog示例,并在用户点击“ok”时获取路径:
如果您希望允许选择目录,请将
allow_picking_directories
设置为True
,但请注意,它不允许选择initial_file_path
。下面是一个简单程序中的上述代码,该程序允许您在单击按钮时选择一个文件: