免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5272 | 回复: 5
打印 上一主题 下一主题

wxPython开发MySQL界面程序错误--大家帮忙看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-23 13:09 |只看该作者 |倒序浏览
本帖最后由 GOD_Father 于 2010-05-23 13:25 编辑

拿wxPython做MySQL的GUI开发,纯属娱乐。结果把自己郁闷了,悲剧!

问题:程序运行都好,点“TestConnect”按钮老是不能正确连接数据库
debug的时候,连接字符串都没问题,IDLE中连接也没问题。郁闷了,大家帮忙看看。

窗口设计代码:
  1. #coding:UTF-8
  2. #wxFrame:Frame1
  3. #LoadingFrame for Db connect seting
  4. #filename:Db_Connect.py
  5. #data:2010-5-22

  6. import wx
  7. import MySQLdb

  8. def create(parent):
  9.     return Frame1(parent)

  10. [wxID_FRAME1, wxID_FRAME1BUTTON1, wxID_FRAME1BUTTON2, wxID_FRAME1BUTTON3,
  11. wxID_FRAME1COMBOBOX1, wxID_FRAME1PANEL1, wxID_FRAME1STATICBOX1,
  12. wxID_FRAME1STATICTEXT1, wxID_FRAME1STATICTEXT2, wxID_FRAME1STATICTEXT3,
  13. wxID_FRAME1STATICTEXT4, wxID_FRAME1STATICTEXT5, wxID_FRAME1STATICTEXT6,
  14. wxID_FRAME1TEXTCTRL1, wxID_FRAME1TEXTCTRL2, wxID_FRAME1TEXTCTRL3,
  15. wxID_FRAME1TEXTCTRL4, wxID_FRAME1TEXTCTRL5,
  16. ] = [wx.NewId() for _init_ctrls in range(18)]

  17. class Frame1(wx.Frame):
  18.     def _init_ctrls(self, prnt):
  19.         # generated method, don't edit
  20.         wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
  21.               pos=wx.Point(607, 221), size=wx.Size(313, 394),
  22.               style=wx.DEFAULT_FRAME_STYLE^
  23.                         (wx.MAXIMIZE_BOX | wx.RESIZE_BORDER),
  24.               title='MySQLdb_Test')
  25.         self.SetClientSize(wx.Size(305, 360))
  26.         self.Bind(wx.EVT_CLOSE, self.OnFrame1Close)

  27.         self.panel1 = wx.Panel(
  28.               id=wxID_FRAME1PANEL1,
  29.               name='panel1',
  30.               parent=self,
  31.               pos=wx.Point(0, 0),
  32.               size=wx.Size(305, 360),
  33.               style=wx.TAB_TRAVERSAL)
  34.         
  35.         #设置主机地址
  36.         self.staticText1 = wx.StaticText(
  37.               id=wxID_FRAME1STATICTEXT1,
  38.               label='Host..:', name='staticText1',
  39.               parent=self.panel1,
  40.               pos=wx.Point(40, 48),
  41.               size=wx.Size(44, 14),
  42.               style=0)
  43.         self.staticText1.SetFont(
  44.               wx.Font(9, wx.SWISS, wx.NORMAL, wx.NORMAL,
  45.               False, 'Tahoma'))

  46.         self.textCtrl1 = wx.TextCtrl(
  47.               id=wxID_FRAME1TEXTCTRL1,
  48.               name='textCtrl1',
  49.               parent=self.panel1,
  50.               pos=wx.Point(104, 46),
  51.               size=wx.Size(167, 22),
  52.               style=0, value='localhost')
  53.         self.textCtrl1.SetToolTipString('textCtrl1')
  54.         self.textCtrl1.SetHelpText('Like this: localhost or 127.0.0.1')
  55.         
  56.         self.staticText2 = wx.StaticText(
  57.               id=wxID_FRAME1STATICTEXT2,
  58.               label='Port..:',
  59.               name='staticText2',
  60.               parent=self.panel1,
  61.               pos=wx.Point(40, 88),
  62.               size=wx.Size(44, 14),
  63.               style=0)
  64.         self.staticText2.SetFont(
  65.               wx.Font(9, wx.SWISS, wx.NORMAL, wx.NORMAL,
  66.               False, 'Tahoma'))
  67.         
  68.         #数据库端口号
  69.         self.textCtrl2 = wx.TextCtrl(
  70.               id=wxID_FRAME1TEXTCTRL2,
  71.               name='textCtrl2',
  72.               parent=self.panel1,
  73.               pos=wx.Point(104, 86),
  74.               size=wx.Size(48, 22),
  75.               style=0, value='3306')

  76.         self.staticText3 = wx.StaticText(
  77.               id=wxID_FRAME1STATICTEXT3,
  78.               label='UserName:',
  79.               name='staticText3',
  80.               parent=self.panel1,
  81.               pos=wx.Point(40, 128), size=wx.Size(48, 14),
  82.               style=0)
  83.         self.staticText3.SetFont(
  84.               wx.Font(9, wx.SWISS, wx.NORMAL, wx.NORMAL,
  85.               False, 'Tahoma'))
  86.         
  87.         #设置用户名
  88.         self.textCtrl3 = wx.TextCtrl(
  89.               id=wxID_FRAME1TEXTCTRL3,
  90.               name='textCtrl3',
  91.               parent=self.panel1,
  92.               pos=wx.Point(104, 124),
  93.               size=wx.Size(100, 22),
  94.               style=0, value='')

  95.         self.staticText4 = wx.StaticText(
  96.               id=wxID_FRAME1STATICTEXT4,
  97.               label='PassWord:',
  98.               name='staticText4',
  99.               parent=self.panel1,
  100.               pos=wx.Point(40, 168), size=wx.Size(44, 14),
  101.               style=0)
  102.         self.staticText4.SetFont(
  103.               wx.Font(9, wx.SWISS, wx.NORMAL, wx.NORMAL,
  104.               False, 'Tahoma'))
  105.         
  106.         #设置密码
  107.         self.textCtrl4 = wx.TextCtrl(
  108.               id=wxID_FRAME1TEXTCTRL4,
  109.               name='textCtrl4',
  110.               parent=self.panel1,
  111.               pos=wx.Point(104, 166),
  112.               size=wx.Size(100, 22),
  113.               style=wx.TE_PASSWORD, value='')

  114.         self.staticText5 = wx.StaticText(
  115.               id=wxID_FRAME1STATICTEXT5,
  116.               label='DataBase:',
  117.               name='staticText5',
  118.               parent=self.panel1,
  119.               pos=wx.Point(40, 208),
  120.               size=wx.Size(48, 14),
  121.               style=0)
  122.         self.staticText5.SetFont(
  123.               wx.Font(9, wx.SWISS, wx.NORMAL, wx.NORMAL,
  124.               False, 'Tahoma'))
  125.         
  126.         #设置默认打开的数据库
  127.         self.textCtrl5 = wx.TextCtrl(
  128.               id=wxID_FRAME1TEXTCTRL5,
  129.               name='textCtrl5',
  130.               parent=self.panel1,
  131.               pos=wx.Point(104, 206),
  132.               size=wx.Size(100, 22),
  133.               style=0, value='')

  134.         self.staticText6 = wx.StaticText(
  135.               id=wxID_FRAME1STATICTEXT6,
  136.               label='   DBType:',
  137.               name='staticText6',
  138.               parent=self.panel1,
  139.               pos=wx.Point(24, 256),
  140.               size=wx.Size(72, 14), style=0)
  141.         
  142.         #选择数据库类型
  143.         #功能待完善,标记1
  144.         self.comboBox1 = wx.ComboBox(
  145.               choices=[],
  146.               id=wxID_FRAME1COMBOBOX1,
  147.               name='comboBox1',
  148.               parent=self.panel1,
  149.               pos=wx.Point(104, 256),
  150.               size=wx.Size(130, 22),
  151.               style=0, value='MySQL')
  152.         self.comboBox1.SetLabel('MySQL')
  153.         self.comboBox1.SetAutoLayout(False)

  154.         self.staticBox1 = wx.StaticBox(
  155.               id=wxID_FRAME1STATICBOX1,
  156.               label='Set Connecting:',
  157.               name='staticBox1',
  158.               parent=self.panel1,
  159.               pos=wx.Point(16, 16),
  160.               size=wx.Size(272, 280),
  161.               style=0)

  162.         self.button1 = wx.Button(
  163.               id=wxID_FRAME1BUTTON1,
  164.               label='TestConnect',
  165.               name='button1',
  166.               parent=self.panel1,
  167.               pos=wx.Point(24, 312),
  168.               size=wx.Size(75, 24),
  169.               style=0)
  170.         self.button1.Bind(
  171.               wx.EVT_BUTTON,
  172.               self.OnButton1Click,
  173.               id=wxID_FRAME1BUTTON1)

  174.         self.button2 = wx.Button(
  175.               id=wxID_FRAME1BUTTON2,
  176.               label=' OK ',
  177.               name='button2',
  178.               parent=self.panel1,
  179.               pos=wx.Point(120, 312),
  180.               size=wx.Size(75, 24), style=0)

  181.         self.button3 = wx.Button(
  182.               id=wxID_FRAME1BUTTON3,
  183.               label='Cancel',
  184.               name='button3',
  185.               parent=self.panel1,
  186.               pos=wx.Point(216, 312),
  187.               size=wx.Size(75, 24), style=0)
  188.         self.button3.Bind(wx.EVT_BUTTON, self.OnButton3, id=wxID_FRAME1BUTTON3)

  189.     def __init__(self, parent):
  190.         self._init_ctrls(parent)

  191.     def OnFrame1Close(self, event):
  192.         self.Destroy()

  193.     def OnButton3(self, event):
  194.         self.Destroy()

  195.     def OnButton1Click(self, event):
  196.         #myhost=str(self.textCtrl1.GetValue())
  197.         #print myhost
  198.         '''
  199.         connStr="host='localhost',port=3306,user='root',
  200.                         passwd='test',db='python'"
  201.          '''
  202.         
  203.         connStr="host='%s',port=%d,user='%s',passwd='%s',db='%s'"%(
  204.         str(self.textCtrl1.GetValue()),
  205.         int(self.textCtrl2.GetValue()),
  206.         str(self.textCtrl3.GetValue()),
  207.         str(self.textCtrl4.GetValue()),
  208.         str(self.textCtrl5.GetValue()),
  209.         )
  210.         #print connStr
  211.         try:
  212.             myConn=MySQLdb.connect(connStr)
  213.             #myConn.Close()
  214.             dlgOk=wx.MessageDialog(
  215.             None,
  216.             "成功连接数据库",
  217.             caption="Success",
  218.             style=wx.OK|wx.ICON_INFORMATION|wx.STAY_ON_TOP,
  219.             )
  220.             retCode=dlgOk.ShowModal()
  221.             if retCode==wx.ID_OK:
  222.                 dlgOk.Destroy()
  223.         except:
  224.             dlgError=wx.MessageDialog(
  225.             None,
  226.             "连接失败,确保数据库已开启并检查设置!",
  227.             caption="ERROR",
  228.             style=wx.OK|wx.ICON_ERROR|wx.STAY_ON_TOP,
  229.             )
  230.             retCode=dlgError.ShowModal()
  231.             if retCode==wx.ID_OK:
  232.                 dlgError.Destroy()
  233.         finally:
  234.             myConn.Close()
复制代码
主程序Db_App.py,调用上面的界面代码文件:
  1. #!/usr/bin/env python
  2. #coding:UTF-8
  3. #MainApp
  4. #filename:Db_App.py
  5. #data:2010-5-22

  6. import wx
  7. import Db_Connect
  8. import MySQLdb

  9. modules ={'Db_Connect': [0, 'Loading Windows', 'Db_Connect.py']}
  10. class App(wx.App):
  11.     #重定向stdOut,stdError到DbApp.log文件
  12.     def __init__(self,redirect=True,filename='DbApp.log'):
  13.         wx.App.__init__(self,redirect,filename)
  14.     def OnInit(self):
  15.         wx.InitAllImageHandlers()
  16.         self.main=Db_Connect.create(None)
  17.         self.main.Show(True)
  18.         self.SetTopWindow(self.main)
  19.         return True
  20.    
  21. def main():
  22.     app=App(redirect=True,filename='DbApp.log')
  23.     app.MainLoop()

  24. if __name__ == '__main__':
  25.     main()
复制代码
界面如下:

运行结果:

论坛徽章:
0
2 [报告]
发表于 2010-05-23 14:29 |只看该作者
晕,try...except 不是这么用的吧,你把 except 抓到的错误信息打印出来不就知道为啥出错了……

论坛徽章:
0
3 [报告]
发表于 2010-05-23 18:57 |只看该作者
回楼上  这么用没什么问题啊

不是try....except结构的问题  

我把连接字符串跟SQL语句字符串弄混了

改好的结果贴一下吧,把窗口设计代码中的221行到230行改为:
  1. try:
  2.             myConn=MySQLdb.connect(
  3.                                    host=str(self.textCtrl1.GetValue()),
  4.                                    port=int(self.textCtrl2.GetValue()),
  5.                                    user=str(self.textCtrl3.GetValue()),
  6.                                    passwd=str(self.textCtrl4.GetValue()),
  7.                                    db=str(self.textCtrl5.GetValue()),
  8.                                    )
复制代码
现在能正确反映是否连接成功了。

论坛徽章:
0
4 [报告]
发表于 2010-05-23 19:55 |只看该作者
成功了就好啊。

论坛徽章:
0
5 [报告]
发表于 2010-05-23 22:15 |只看该作者
本帖最后由 jjj137 于 2010-05-24 14:03 编辑
回楼上  这么用没什么问题啊

不是try....except结构的问题  

我把连接字符串跟SQL语句字符串弄混了:e ...
GOD_Father 发表于 2010-05-23 18:57



    我是说在调试程序时的作用,try...except 里的信息对找出错误在哪很有用。就算是在成品里,也应该把 except 的信息记入 Log 文件,而不仅仅是显示一个对话框……

论坛徽章:
0
6 [报告]
发表于 2010-05-23 23:48 |只看该作者


感谢指教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP