# 创建按钮2、3 self.button2 = wx.Button(self, label="导入数据") self.button2.Bind(wx.EVT_BUTTON, self.on_button2_click) self.button3 = wx.Button(self, label="查看结果") self.button3.Bind(wx.EVT_BUTTON, self.on_button3_click)报错 self.button3.Bind(wx.EVT_BUTTON, self.on_button3_click) AttributeError: 'MyFrame' object has no attribute 'on_button3_click' OnInit returned false, exiting...
时间: 2023-11-28 14:50:15 浏览: 35
这个错误提示说明在 `MyFrame` 类中没有定义 `on_button3_click` 方法。您需要在 `MyFrame` 类中定义 `on_button3_click` 方法,以便在按钮被点击时执行相应的操作。您可以像这样定义该方法:
```
def on_button3_click(self, event):
# 执行按钮3被点击时的操作
```
然后,将该方法绑定到按钮3的 `EVT_BUTTON` 事件上,就像您绑定按钮2的方法一样:
```
self.button3.Bind(wx.EVT_BUTTON, self.on_button3_click)
```
如果您已经定义了 `on_button3_click` 方法,但仍然收到此错误消息,则可能是因为该方法名称与您在绑定事件时使用的名称不匹配。请确保方法名称正确拼写并匹配绑定事件时使用的名称。
相关问题
# coding=utf-8 # 文件位置: code\cho13\ch13_8_4.py import wx class MyFrame(wx.Frame): def __init__(self): super().__init__(None, title='静态图片控制', size=(300, 300)) self.panel = wx.Panel(parent=self) self.bmps = [wx.Bitmap('images/3.jpg', wx.BITMAP_TYPE_JPG), wx.Bitmap('images/4.jpg', wx.BITMAP_TYPE_JPG), wx.Bitmap('images/1.webp', wx.BITMAP_TYPE_WEBP)] b1 = wx.Button(self.panel, id=1, label='Button1') b2 = wx.Button(self.panel, id=1, label='Button2') self.Bind(wx.EVT_BUTTON, self.on_click, id=1, id2=2) self.image = wx.StaticBitmap(self.panel, bitmap=self.bmps[0]) vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(b1, proportion=1, flag=wx.EXPAND) vbox.Add(b2, proportion=1, flag=wx.EXPAND) vbox.Add(self.image, proportion=3, flag=wx.EXPAND) self.panel.SetSizer(vbox) def on_click(self, event): event_id = event.GetId() if event_id == 1: self.image.SetBitmap(self.bmps[1]) else: self.image.SetBitmap(self.bmps[2]) self.panel.Layout() app = wx.App() frm = wx.Frame frm.Show() app.MainLoop()
这段代码存在一些错误,无法正常运行。以下是错误的修正:
1. 缺少括号:`frm = wx.Frame`应该改为`frm = MyFrame()`
2. EVT_BUTTON绑定错误:应该是`self.Bind(wx.EVT_BUTTON, self.on_click, id=1)`和`self.Bind(wx.EVT_BUTTON, self.on_click, id=2)`,分别绑定id为1和2的按钮。
3. 图片路径错误:需要将图片放在与代码同级的images文件夹下。
修正后的代码如下:
```python
# coding=utf-8
# 文件位置: code\cho13\ch13_8_4.py
import wx
class MyFrame(wx.Frame):
def __init__(self):
super().__init__(None, title='静态图片控制', size=(300, 300))
self.panel = wx.Panel(parent=self)
self.bmps = [wx.Bitmap('images/3.jpg', wx.BITMAP_TYPE_JPG),
wx.Bitmap('images/4.jpg', wx.BITMAP_TYPE_JPG),
wx.Bitmap('images/1.webp', wx.BITMAP_TYPE_WEBP)]
b1 = wx.Button(self.panel, id=1, label='Button1')
b2 = wx.Button(self.panel, id=2, label='Button2')
self.Bind(wx.EVT_BUTTON, self.on_click, id=1)
self.Bind(wx.EVT_BUTTON, self.on_click, id=2)
self.image = wx.StaticBitmap(self.panel, bitmap=self.bmps[0])
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(b1, proportion=1, flag=wx.EXPAND)
vbox.Add(b2, proportion=1, flag=wx.EXPAND)
vbox.Add(self.image, proportion=3, flag=wx.EXPAND)
self.panel.SetSizer(vbox)
def on_click(self, event):
event_id = event.GetId()
if event_id == 1:
self.image.SetBitmap(self.bmps[1])
else:
self.image.SetBitmap(self.bmps[2])
self.panel.Layout()
app = wx.App()
frm = MyFrame()
frm.Show()
app.MainLoop()
```
“ class MyDialog13(wx.Dialog): def __init__(self, parent): wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title=u"菜品下架", pos=wx.DefaultPosition, size=wx.Size(200, 200), style=wx.DEFAULT_DIALOG_STYLE) self.Center() self.panel = wx.Panel(self) self.panel.SetBackgroundColour('white') wx.StaticText(self.panel, -1, "菜品名称:", (20, 20)) self.t1 = wx.TextCtrl(self.panel, pos=(20, 50), size=(120, 25)) def OnClick(self, e): dialog13 = MyDialog13(None) btn = wx.Button(parent=dialog13.panel, label="下架", pos=(20, 90), size=(90, 40)) btn.Bind(wx.EVT_BUTTON, dialog13.delete) dialog13.ShowModal() def delete(self, e): conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='wm', charset='utf8') cursor = conn.cursor() shop_name = self.t1.GetValue().encode('utf8') # 注意GetValue()获取的是unicode编码 try: sql = "delete from foodshop where shop_name=%s" cursor.execute(sql, shop_name) conn.commit() dial = wx.MessageDialog(None, '成功下架!', '结果', wx.YES_NO) # 创建一个带按钮的对话框, 语法是(self, 内容, 标题, ID) dial.ShowModal() # 显示对话框 except: conn.rollback() finally: cursor.close() conn.close()”逐行解释代码
这段代码是一个使用 wxPython 库实现的 GUI 程序,用于下架一个餐厅菜品。以下是对代码逐行的解释:
```python
class MyDialog13(wx.Dialog):
def __init__(self, parent):
wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title=u"菜品下架", pos=wx.DefaultPosition,
size=wx.Size(200, 200), style=wx.DEFAULT_DIALOG_STYLE)
self.Center() # 将对话框置于屏幕中央
self.panel = wx.Panel(self) # 创建一个面板
self.panel.SetBackgroundColour('white') # 设置面板背景颜色为白色
wx.StaticText(self.panel, -1, "菜品名称:", (20, 20)) # 创建一个静态文本控件,用于提示输入
self.t1 = wx.TextCtrl(self.panel, pos=(20, 50), size=(120, 25)) # 创建一个文本框控件,用于输入菜品名称
def OnClick(self, e):
dialog13 = MyDialog13(None) # 创建一个新的对话框
btn = wx.Button(parent=dialog13.panel, label="下架", pos=(20, 90), size=(90, 40)) # 创建一个按钮控件,用于触发下架操作
btn.Bind(wx.EVT_BUTTON, dialog13.delete) # 绑定按钮事件和下架函数
dialog13.ShowModal() # 显示对话框
def delete(self, e):
# 连接数据库
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='wm', charset='utf8')
cursor = conn.cursor()
shop_name = self.t1.GetValue().encode('utf8') # 获取菜品名称
try:
# 执行删除操作
sql = "delete from foodshop where shop_name=%s"
cursor.execute(sql, shop_name)
conn.commit()
# 显示成功对话框
dial = wx.MessageDialog(None, '成功下架!', '结果', wx.YES_NO)
dial.ShowModal()
except:
conn.rollback() # 出现异常时回滚
finally:
cursor.close() # 关闭游标
conn.close() # 关闭数据库连接
```
该程序中定义了一个 `MyDialog13` 类,继承自 `wx.Dialog` 类,用于创建一个对话框。在该类的构造函数中,先调用父类构造函数初始化对话框,然后创建一个面板,并在该面板上添加一个静态文本控件和一个文本框控件,用于输入要下架的菜品名称。在 `OnClick` 函数中,创建一个新的对话框,并在该对话框中添加一个按钮控件,用于触发下架操作,同时绑定按钮事件和下架函数。在 `delete` 函数中,连接数据库并获取要下架的菜品名称,然后执行删除操作,如果成功则显示一个成功对话框,否则回滚操作。最后关闭游标和数据库连接。