通过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()
操作过程:程序运行后,从文件夹拖拽文件至窗口:
拖拽后显示:
需要解决的问题:
文章来源:https://www.toymoban.com/news/detail-616941.html
标题不出现乱码的方法:不重复执行 pygame.display.set_mode() 即可文章来源地址https://www.toymoban.com/news/detail-616941.html
到了这里,关于在pygame中,实现文件拖拽功能,返回完整的文件路径和文件名的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!