python小白询问如何给wxpython中循环初始化的按钮绑定不同的事件,以及在frame中添加一个拖动块
我想完成用BitmapButton做的电子相册预览,一行6个位图按钮,点击其中一个按钮,都会弹出相关的figure展示它们。但不知循环绑定出了什么问题,点击一次后不能弹出对应的figure,只会弹出最后一个图的figure,且再次点击别的按钮会报错:MatplotlibDeprecationWarning: Passing the block parameter of show() positionally is deprecated since Matplotlib 3.1; the parameter will become keyword-only in 3.3.self.tk.mainloop(n)
代码如下:
程序代码:import wx
from PIL import Image
import matplotlib.pyplot as plt
import os
import tkinter
import re
import pygame
class MyFrame(wx.Frame): # 子类化框架对像
def __init__(self, parent): # 定义子类构造器,i,j为pos的横纵坐标
i = 10
j = 10
h = 1
wx.Frame.__init__(self, parent, -1, 'TextEntryDialog', pos=(300, 200), size=(1000, 1000)) # 调用父类构造器(必须)
panel = wx.Panel(self) # 创建画板,控件容器
for f in os.listdir(r'e:\photo2'):
newpath = r'e:\photo2' + "\\" + f
print(newpath)
#wx.Frame.__init__(self, parent, -1, 'TextEntryDialog', pos=(300, 200), size=(1000, 1000))
#panel = wx.Panel(self) # 创建画板,控件容器
pic = wx.Image(newpath, wx.BITMAP_TYPE_BMP).ConvertToBitmap() # 载入bmp图片
self.button = wx.BitmapButton(panel, -1, pic, pos=(i, j), size=(150, 300)) # 创建bmp按钮
#plt.figure(10)
# f = path + '\\' + name
im = Image.open(newpath)
print(im.size)
plt.imshow(im)
plt.axis('off')
# 成功进行到这里
#self.Bind(wx.EVT_BUTTON, self.Destroy, self.button) # 绑定bmp按钮事件
self.Bind(wx.EVT_BUTTON, plt.show, self.button) # 绑定bmp按钮事件
i = i + 170
h = h + 1
if h > 6:
h = 1
i = 10
j = j + 310
def onclick(self):
for f in os.listdir(r'e:\photo2'):
newpath = r'e:\photo2' + "\\" + f
print(newpath)
im = Image.open(newpath)
print(im.size)
plt.imshow(im)
plt.axis('off')
if __name__ == '__main__':
appl = wx.App()
#app = wxGUI()
#app.MainLoop()
a = a=MyFrame(parent=None)
#a.__init__(parent=None)
a.Show(True)
appl.MainLoop()运行代码结果如下:





