在pygame中,实现文件拖拽功能,返回完整的文件路径和文件名

本文介绍如何在Pygame中实现文件拖拽功能,并提供了一个示例程序。该程序允许用户将文件拖放到窗口内,展示文件路径。文章还提到了在调整窗口大小时标题栏可能出现的乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过windnd可以在pygame中,实现文件拖拽功能,返回完整的文件路径和文件名,经过测试,拖拽文件正常,代码如下:

代码中使用了pygame,如果没有安装,可以用 

pip install pygame

 进行安装。

代码中使用了windnd,如果没有安装,可以用 

pip install windnd

 进行安装。

程序在python 3.10中测试,拖拽文件正常,但当二次 pygame.display.set_mode() 时,标题会出现乱码,需要高手指点,谢谢!

完整代码如下:

# encoding:utf-8
import pygame
from pygame.locals import *
import windnd  # 实现文件的拖拽功能

class pygame_dragfiles():
    def __init__(self, screen) -> None:
        '''向pygame窗口,实现文件拖拽功能
        在python 3.10测试成功,但有一小问题需要求助解决
        '''
        self.screen = screen
        self.display_w = self.screen.get_width()
        self.display_h = self.screen.get_height()
        self.caption = "实现文件拖拽: 文件窗口Resize后,标题栏会出现乱码 abcdefg1234567890."
        # 编码有('utf-8','utf-7','utf-16','utf-32','gb2312','cp936','gbk','gb18030','ASCII','ISO-8859-1','windows-1252','Big5','Shift_JIS','EUC-JP','EUC-KR','KS_C_5601-1987','JOHAB')
        pygame.display.set_caption(self.caption)
        hwnd = pygame.display.get_wm_info()['window']  # 获取句柄
        windnd.hook_dropfiles(
            hwnd, func=self.dragg)  # 实现文件的拖拽功能 用此后,resize窗口标题会乱码,还没有解决!!!
        self.dragg_files = []
        self.main()

    def dragg(self, files):  # 实现文件的拖拽功能
        self.dragg_files = []
        for item in files:
            self.dragg_files.append(item.decode('gbk'))

    def update(self):
        self.screen.fill(0)
        self.str_to_screen('↑↑↑ 刚进入程序时,以上标题显示是正确的', 30, 10, 20, (255, 55, 55))
        self.str_to_screen('如果缩放窗口,标题就会现出乱码!!! 这个问题需要解决,向高手求助!如果不需要缩放窗口,就不存在此问题啦。', 30, 50, 20,(255, 55, 55))
        self.str_to_screen('产生的根源主要是在pygame中为实现文件的拖拽功能,且要限制窗口最小宽和高', 30, 90,20, (255, 55, 55))
        self.str_to_screen('使用了 windnd.hook_dropfiles() 和 pygame.display.set_mode() 语句', 30,130, 20, (255, 55, 55))
        self.str_to_screen('现在可以从外部拖拽文件到此窗口,实现文件的拖拽功能:', 30, 170, 20,(0, 255, 0))
        for i in range(len(self.dragg_files)):
            self.str_to_screen(f'{self.dragg_files[i]}', 30, 200 + i * 25, 20,(0, 255, 0))

    def str_to_screen(self, string, x, y, fontsize, color):
        cur_font = pygame.font.SysFont('simhei', fontsize)
        textSurf = cur_font.render(string, True, color)
        self.screen.blit(textSurf, (x, y))

    def main(self):
        run = True
        while run:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False
                elif event.type == pygame.KEYDOWN:
                    if event.key == K_ESCAPE:
                        run = False
                elif event.type == pygame.VIDEORESIZE:
                    resizewindow(event.size)
                    self.display_w = self.screen.get_width()
                    self.display_h = self.screen.get_height()
                self.update()
                pygame.display.update()

def resizewindow(screen_w_h=(600, 400)):
    global screen  #,screen_w,screen_h
    screen_w, screen_h = screen_w_h
    if screen_w < 600:  #限止最小宽度
        screen_w = 600
    if screen_h < 400:  #限止最小高度
        screen_h = 400
    screen = pygame.display.set_mode((screen_w, screen_h),RESIZABLE)  # 如果这一句不执行,标题也不会产生乱码

if __name__ == '__main__':
    pygame.init()
    screen = pygame.display.set_mode((1100, 400), RESIZABLE)  #.convert_alpha()
    pygame_dragfiles(screen)
    pygame.quit()

操作过程:程序运行后,从文件夹拖拽文件至窗口:

拖拽后显示: 

需要解决的问题:

 

标题不出现乱码的方法:不重复执行 pygame.display.set_mode() 或者不允许 resize 即可。

pygame实现存档功能通常涉及到文件的读写操作。游戏存档一般用于保存玩家的游戏进度,比如分数、关卡状态、玩家位置等信息。pygame没有提供专门的存档模块,因此你可以使用Python的标准文件操作函数来实现存档功能。下面是一个简单的例子,展示如何使用pygame结合Python文件操作来实现存档功能: ```python import json import os # 游戏存档数据字典 save_data = { 'score': 0, 'level': 1, 'player_position': (0, 0) } # 保存存档 def save_game(filename, data): # 将字典数据转换为字符串 save_str = json.dumps(data) # 写入文件 with open(filename, 'w') as file: file.write(save_str) # 加载存档 def load_game(filename): # 文件存在检查 if os.path.exists(filename): with open(filename, 'r') as file: save_str = file.read() # 将字符串转换回字典 return json.loads(save_str) else: return None # 假设存档文件名为"savegame.json" filename = "savegame.json" # 保存游戏状态 save_game(filename, save_data) # 加载游戏状态 load_data = load_game(filename) if load_data: print("游戏已加载,分数为:", load_data['score']) ``` 这个例子中,我们首先创建了一个字典`save_data`,其中包含了一些示例的游戏存档数据。然后定义了`save_game`函数来保存游戏状态,它将字典数据转换成JSON格式的字符串,并写入指定的文件中。`load_game`函数用于加载存档,它读取文件中的字符串并将其转换回字典。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘庆豪2007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值