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

通过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() 即可

猜你喜欢

转载自blog.csdn.net/weixin_69832035/article/details/127665622