如何提示用户用python3打开文件?

1l5u6lss  于 2023-01-22  发布在  Python
关注(0)|答案(2)|浏览(156)

我正在做一个游戏,我希望用户能够点击一个按钮,打开文件管理器,并要求他们打开一个游戏保存文件。有一个模块/我怎么能把这个放在我的游戏?如果没有好的图形用户界面的方式,我怎么做一个文本输入的东西(不使用终端)?谢谢!

nc1teljy

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

zphenhs4

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

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

相关问题