【问题标题】:Problem about transfer value and combobox at wxPythonwxPython中关于传递值和组合框的问题
【发布时间】:2020-03-08 00:08:19
【问题描述】:

大家好,我是 wxpython 新手。 在我上传问题但尚未解决的前一周。

所以今天我需要更多关于我的问题的帮助

所以这里是代码......

# -*- coding:utf-8 -*-

import wx 
import sqlite3 

    from PIL import Image # for image processing
    from wx.adv import Animation, AnimationCtrl # for gif Animation


    conn = sqlite3.connect('reference_file.rre')
    cur = conn.cursor()

class MyApp(wx.App):
    def OnInit(self):

        self.frame = errorCode_SAC(None, title ="Guide") 
        self.SetTopWindow(self.frame)
        self.frame.Show()

        return True

class errorCode_SAC(wx.Frame):

    # constructor
    def __init__(self, parent, id=wx.ID_ANY, title="Search", pos=wx.DefaultPosition, size=(1500,650), style=wx.DEFAULT_FRAME_STYLE, name=""):
         super(errorCode_SAC, self).__init__(parent, id, title, pos, size, style, name="")

        self.Panel_err_sac = wx.Panel(self,wx.ID_ANY, pos=(0,0), size=(774, 608)) 

        self.Panel_dd = wx.Panel(self, wx.ID_ANY, pos=(777,0), size=(1,608))

        self.Panel_err_sac_result = wx.Panel(self,wx.ID_ANY, pos=(778,0), size=(706, 308)) 
        self.Panel_err_image = wx.Panel(self,wx.ID_ANY, pos=(778,309), size=(706,300)) 

        self.explBox_err_sac = wx.StaticBox(self.Panel_err_sac, wx.ID_ANY, "[ Instruction ]", pos = (8,10), size=(756, 200))

        self.lbname1 = wx.StaticText(self.explBox_err_sac, label="1.input name.",pos=(10,20))

        self.sa_ra_code_box = wx.StaticBox(self.Panel_err_sac, wx.ID_ANY, "[ input model ]", pos=(8,230), size=(340,80))

        self.sa_err_code_CeNa = wx.TextCtrl(self.sa_ra_code_box, wx.ID_ANY, pos=(8,30), size=(260,22))
        self.button = wx.Button(self.sa_ra_code_box, wx.ID_OK, label="search", size=(50,23), pos = (280,30))
        self.button.SetDefault()


        self.sa_er_Box = wx.StaticBox(self.Panel_err_sac, wx.ID_ANY, "[ Search by input name ]", pos = (8,320), size = (340,280))
        self.sa_er_inputkw = wx.StaticText(self.sa_er_Box, label="",pos=(8,15), size=(10,40), style=wx.ALIGN_LEFT)
        self.sa_er_middle = wx.StaticText(self.sa_er_Box, label=" by", pos=(50,15))
        self.sa_er_middle = wx.StaticText(self.sa_er_Box, label="", pos=(8,30))
        self.sa_er_footer = wx.StaticText(self.sa_er_Box, label=" searched",pos=(50,30))

        self.sa_er_svlist = wx.ListCtrl(self.sa_er_Box, -1, pos = (8,60), size = (330,200), style = wx.LC_REPORT | wx.SUNKEN_BORDER)
        self.sa_er_svlist.InsertColumn(0,"model")
        self.sa_er_svlist.InsertColumn(1,"spec")
        self.sa_er_svlist.SetColumnWidth(0,100)

        self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.sa_err_catelist_OnClick, self.sa_er_svlist)         
        self.button.Bind(wx.EVT_BUTTON, self.sa_err_search_OnButton) 


        self.sa_er_result_Box = wx.StaticBox(self.Panel_err_sac, wx.ID_ANY, "[ check list ]", pos=(360,230), size =(405,370)) 
        self.sa_er_question_ti = wx.StaticText(self.sa_er_result_Box, label="", pos=(50,20), size = (130,-1))

        self.sa_er_question_text = wx.StaticText(self.sa_er_result_Box, label="point", pos = (10,50), size = (130,-1))                                    
        self.sa_er_question_te = wx.StaticText(self.sa_er_result_Box, label="", pos=(50,50), size = (130,-1)) 



        self.P_err_sac_case1 = wx.StaticBox(self.Panel_err_sac_result, wx.ID_ANY, "[ check list below ]", pos = (8,10), size=(690,60))
        self.P_err_sac_case2 = wx.StaticBox(self.Panel_err_sac_result, wx.ID_ANY, "[ symptom ]", pos=(8,90), size =(690,200))

        self.cas2_symp = wx.StaticText(self.P_err_sac_case2, label="selected symptom is..", pos=(10,20))
        self.cas2_symp_text = wx.StaticText(self.P_err_sac_case2, label="", pos=(10,40))

        self.cas2_descrip = wx.StaticText(self.P_err_sac_case2, label="cause....", pos=(10,70))
        self.cas2_descrip_text = wx.StaticText(self.P_err_sac_case2, label="", pos=(10,90)) 

        # -- Combo box 
        items=[] # Dummy list
        self.cb = wx.ComboBox(self.P_err_sac_case1, pos=(10,30),size=(500,20), choices=items, style=wx.CB_READONLY) 
        self.Bind(wx.EVT_COMBOBOX, self.OnSelectComboBox) 


# -- search query

    def sa_err_search_OnButton(self, e): 

        self.sa_er_inputkw.SetLabel(self.sa_err_code_CeNa.GetValue())
        searchResult = "%"+self.sa_err_code_CeNa.GetValue()+"%"
        self.sa_er_svlist.DeleteAllItems()


        sa_err_code_CeNa = cur.execute("Select * from sa_er_cate where cate like '"+searchResult+"'")

        count = 0

        for i in sa_err_code_CeNa:
            self.sa_er_svlist.Append(i[1:3])
            count = count +1
            self.sa_er_middle.SetLabel(str(count))

        self.Bind(wx.EVT_CLOSE, self.on_close)

    def on_close(self,e):
        self.Destroy()


    def sa_err_catelist_OnClick(self, event):

        sa_idx = event.GetIndex()
        sa_err_check = self.sa_er_svlist.GetItem(sa_idx, 0).GetText()
        sa_err_check_Comment = cur.execute("select cate,chek_comment from sa_er_cate where cate ='%s'" %sa_err_check)

        for row in sa_err_check_Comment:
            self.sa_er_question_ti.SetLabel(row[0])
            self.sa_er_question_te.SetLabel(row[1])


        model_name_string = row[0] 


        result_query_1 = cur.execute("Select symp from sac_er_ramp where cate='%s'" % model_name_string)


        list=[] 


        for row_test in result_query_1:

            list.append(row_test[0])

        self.cb.SetItems(list)


    def OnSelectComboBox(self,event):

        item = event.GetString()


        result_query_2 = cur.execute("Select symp, descrip, judgement,image from sac_er_ramp where symp='%s'" % item)

        for row in result_query_2:
            self.cas2_symp_text.SetLabel(row[0])
            self.cas2_descrip_text.SetLabel(row[1])

            imageno = row[3]


        # -- IMAGE

        erim = Image.open('./image/image_error_ramp/%s.webp' % imageno)
        erim.info.pop('background',None)
        erim.save('./image/image_error_ramp/%s.gif' % imageno,save_all=True, loop=0)
        anim = Animation('./image/image_error_ramp/%s.gif' % imageno)
        ctrl = AnimationCtrl(self.Panel_err_image, -1,anim, pos=(35,40))
        ctrl.Play()
        os.remove('./image/image_error_ramp/%s.gif' % imageno)            


if __name__=="__main__":
    app = MyApp(False)
    app.MainLoop()

这段代码的进度如下

  1. 在 textctrl 处输入“型号名称”
  2. 搜索“相关模型”并将按钮绑定到事件(以获取特定模型名称)
  3. 从 listctrl 中选择一个“模型”绑定到事件(以获取组合框的元素)
  4. 和组合框的列表填充相关列表(列表的元素来自 sqlie)
  5. 选择一个组合框元素并显示相关图像(图像是 GIF 动画)

下面是我的问题

  1. 当我选择组合框列表并在面板上播放动画 GIF 时。 并选择组合框的另一个元素,动画GIF播放另一个,图像重叠

  2. 下面的代码...图像转换和播放代码...我将此代码称为“图像” (我把所有的 Animated GIF 都保存到 webp 并转换为 gif)

        erim = Image.open('./image/image_error_ramp/%s.webp' % imageno) 
        erim.info.pop('background',None)
        erim.save('./image/image_error_ramp/%s.gif' % imageno,save_all=True, loop=0)
        anim = Animation('./image/image_error_ramp/%s.gif' % imageno)
        ctrl = AnimationCtrl(self.Panel_err_image, -1,anim, pos=(35,40))
        ctrl.Play()
        os.remove('./image/image_error_ramp/%s.gif' % imageno) 
    
  3. 所以我想也许可以解决将“IMAGE”代码移动到构造函数代码下方的问题(因为 init 构造函数在那里。)

        # constructor
        def __init__(self, parent, id=wx.ID_ANY, title="Search", pos=wx.DefaultPosition, size=(1500,650), style=wx.DEFAULT_FRAME_STYLE, name=""):
    
            IMAGE CODE
    
  4. 在这里(在构造函数代码下方)我无法获取 imageno(imageno 是图像的名称。这个名称来自 sqlite,所以我从组合框中选择一个元素,但我无法得到任何响应组合框)

  5. 我的问题是这个

    • 我可以从带有组合框的构造函数代码下面的sqlite中获取图像的名称吗?

    • 或在原始位置(注释“IMAGE”下方)任何“动画 GIF 不重叠”的代码?

    ps。一周前,萨克森的罗宾·邓恩和罗尔夫教我这个问题 但是看不懂也很郁闷.....

    祝你今天愉快

【问题讨论】:

    标签: image constructor combobox initialization wxpython


    【解决方案1】:

    很难知道从哪里开始回答这个问题,因为存在编码错误、逻辑错误,而且我不知道数据是什么样的。
    但是,有几件事很突出。

    • sqlite 查询需要fetch 才能返回行/行
      使用 fetchone()、fetchmany(n) 或 fetchall()
    • 当测试 print() 是你的朋友,如果不使用 IDE
      打印结果以检查您是否符合预期
    • 始终假设可能发生了错误,例如使用 if 进行测试或尝试
    • 初始化变量,尤其是在 if 语句中设置变量时
      假设测试可能会失败。

    也就是说,我赞赏您的 go for it 态度,但您可以通过更小的步骤来做到这一点。在尝试将它们全部组合在一起之前掌握每个步骤。

    这是您的代码的一个版本,其中包含许多警告。
    我不知道您的数据或数据结构。
    我首先在我的数据库中创建了一些虚拟记录。
    我不知道你的目标或逻辑。
    只有那些我需要解决以获得基本正常运行的程序的问题已经得到解决,并且我已经删除了一些围绕图像处理的代码来帮助我而不是你。
    希望您能在下面的代码中找到一些好处。
    我建议在我的代码和你的代码上使用“差异”,看看有什么变化。

    import wx
    import sqlite3
    
    from PIL import Image # for image processing
    from wx.adv import Animation, AnimationCtrl # for gif Animation
    
    
    conn = sqlite3.connect('reference_file.rre', isolation_level=None)
    conn.row_factory = sqlite3.Row
    cur = conn.cursor()
    result = cur.execute("create table if not exists sa_er_cate (cate TEXT PRIMARY KEY NOT NULL,chek_comment TEXT)");
    result = cur.execute("create table if not exists sa_er_ramp (cate TEXT PRIMARY KEY NOT NULL, symp TEXT, descrip TEXT, judgement TEXT,image TEXT)");
    
    # Define a default data
    cur.execute("select * from sa_er_cate where (cate=?)",["no1"]);
    MyCate = cur.fetchone()
    if not MyCate:
        try:
            conn.execute("insert into sa_er_cate (cate, chek_comment) values (?,?)"\
            ,("no1","comment 1"));
        except sqlite3.Error as e:
            print('Default Cate Insert Error '+str(e), 'Error')
        try:
            conn.execute("insert into sa_er_cate (cate, chek_comment) values (?,?)"\
            ,("no2","comment 2"));
        except sqlite3.Error as e:
            print('Default Cate Insert Error '+str(e), 'Error')
    
    cur.execute("select * from sa_er_ramp where (cate=?)",["no1"]);
    MySymp = cur.fetchone()
    if not MySymp:
        try:
            conn.execute("insert into sa_er_ramp (cate, symp, descrip, judgement, image) values (?,?,?,?,?)"\
            ,("no1","no1","description 1","judgement  1","Image1"));
        except sqlite3.Error as e:
            print('Default Symp Insert Error '+str(e), 'Error')
        try:
            conn.execute("insert into sa_er_ramp (cate,symp, descrip, judgement, image) values (?,?,?,?,?)"\
            ,("no2","no2","description 2","judgement 2","Image2"));
        except sqlite3.Error as e:
            print('Default Symp Insert Error '+str(e), 'Error')
    
    
    class MyApp(wx.App):
        def OnInit(self):
    
            self.frame = errorCode_SAC(None, title ="Guide")
            self.SetTopWindow(self.frame)
            self.frame.Show()
    
            return True
    
    class errorCode_SAC(wx.Frame):
    
        # constructor
        def __init__(self, parent, id=wx.ID_ANY, title="Search", pos=wx.DefaultPosition, size=(1500,650), style=wx.DEFAULT_FRAME_STYLE, name=""):
            super(errorCode_SAC, self).__init__(parent, id, title, pos, size, style, name="")
    
            self.Panel_err_sac = wx.Panel(self,wx.ID_ANY, pos=(0,0), size=(774, 608))
    
            self.Panel_dd = wx.Panel(self, wx.ID_ANY, pos=(777,0), size=(1,608))
    
            self.Panel_err_sac_result = wx.Panel(self,wx.ID_ANY, pos=(778,0), size=(706, 308))
            self.Panel_err_image = wx.Panel(self,wx.ID_ANY, pos=(778,309), size=(706,300))
    
            self.explBox_err_sac = wx.StaticBox(self.Panel_err_sac, wx.ID_ANY, "[ Instruction ]", pos = (8,10), size=(756, 200))
    
            self.lbname1 = wx.StaticText(self.explBox_err_sac, label="1.input name.",pos=(10,20))
    
            self.sa_ra_code_box = wx.StaticBox(self.Panel_err_sac, wx.ID_ANY, "[ input model ]", pos=(8,230), size=(340,80))
    
            self.sa_err_code_CeNa = wx.TextCtrl(self.sa_ra_code_box, wx.ID_ANY, pos=(8,30), size=(260,22))
            self.button = wx.Button(self.sa_ra_code_box, wx.ID_OK, label="search", size=(50,23), pos = (280,30))
            self.button.SetDefault()
    
    
            self.sa_er_Box = wx.StaticBox(self.Panel_err_sac, wx.ID_ANY, "[ Search by input name ]", pos = (8,320), size = (340,280))
            self.sa_er_inputkw = wx.StaticText(self.sa_er_Box, label="",pos=(8,15), size=(10,40), style=wx.ALIGN_LEFT)
            self.sa_er_middle = wx.StaticText(self.sa_er_Box, label=" by", pos=(50,15))
            self.sa_er_middle = wx.StaticText(self.sa_er_Box, label="", pos=(8,30))
            self.sa_er_footer = wx.StaticText(self.sa_er_Box, label=" searched",pos=(50,30))
    
            self.sa_er_svlist = wx.ListCtrl(self.sa_er_Box, -1, pos = (8,60), size = (330,200), style = wx.LC_REPORT | wx.SUNKEN_BORDER)
            self.sa_er_svlist.InsertColumn(0,"model")
            self.sa_er_svlist.InsertColumn(1,"spec")
            self.sa_er_svlist.SetColumnWidth(0,100)
    
            self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.sa_err_catelist_OnClick, self.sa_er_svlist)
            self.button.Bind(wx.EVT_BUTTON, self.sa_err_search_OnButton)
    
    
            self.sa_er_result_Box = wx.StaticBox(self.Panel_err_sac, wx.ID_ANY, "[ check list ]", pos=(360,230), size =(405,370))
            self.sa_er_question_ti = wx.StaticText(self.sa_er_result_Box, label="", pos=(50,20), size = (130,-1))
    
            self.sa_er_question_text = wx.StaticText(self.sa_er_result_Box, label="point", pos = (10,50), size = (130,-1))
            self.sa_er_question_te = wx.StaticText(self.sa_er_result_Box, label="", pos=(50,50), size = (130,-1))
    
    
    
            self.P_err_sac_case1 = wx.StaticBox(self.Panel_err_sac_result, wx.ID_ANY, "[ check list below ]", pos = (8,10), size=(690,80))
            self.P_err_sac_case2 = wx.StaticBox(self.Panel_err_sac_result, wx.ID_ANY, "[ symptom ]", pos=(8,110), size =(690,200))
    
            self.cas2_symp = wx.StaticText(self.P_err_sac_case2, label="selected symptom is..", pos=(10,20))
            self.cas2_symp_text = wx.StaticText(self.P_err_sac_case2, label="", pos=(10,40))
    
            self.cas2_descrip = wx.StaticText(self.P_err_sac_case2, label="cause....", pos=(10,70))
            self.cas2_descrip_text = wx.StaticText(self.P_err_sac_case2, label="", pos=(10,90))
    
            # -- Combo box
            items=[] # Dummy list
            self.cb = wx.ComboBox(self.P_err_sac_case1, pos=(10,30),size=(500,30), choices=items, style=wx.CB_READONLY)
            self.Bind(wx.EVT_COMBOBOX, self.OnSelectComboBox)
            self.Bind(wx.EVT_CLOSE, self.on_close)
    
    
    # -- search query
    
        def sa_err_search_OnButton(self, e):
    
            self.sa_er_inputkw.SetLabel(self.sa_err_code_CeNa.GetValue())
            searchResult = "%"+self.sa_err_code_CeNa.GetValue()+"%"
            self.sa_er_svlist.DeleteAllItems()
    
            sa_err_code_CeNa = cur.execute("Select * from sa_er_cate where cate like '"+searchResult+"'")
            rows = cur.fetchall()
    
            count = 0
    
            for i in rows:
                self.sa_er_svlist.Append(i[0:3])
                count += 1
                self.sa_er_middle.SetLabel(str(count))
    
        def on_close(self,e):
            self.Destroy()
    
        def sa_err_catelist_OnClick(self, event):
    
            sa_idx = event.GetIndex()
            sa_err_check = self.sa_er_svlist.GetItem(sa_idx, 0).GetText()
            print("1",sa_err_check)
            sa_err_check_Comment = cur.execute("select cate,chek_comment from sa_er_cate where cate ='%s'" %sa_err_check)
            row = cur.fetchone()
            print("2",row)
            if row:
                self.sa_er_question_ti.SetLabel(row[0])
                self.sa_er_question_te.SetLabel(row[1])
                print (row)
            model_name_string = row[0]
    
    
    
            result_query_1 = cur.execute("Select symp from sa_er_ramp where cate='%s'" % model_name_string)
            rows = cur.fetchall()
    
    
            res_list=["Select an option"]
    
    
            for row_test in rows:
    
                res_list.append(row_test[0])
    
            self.cb.SetItems(res_list)
            self.cb.SetSelection(0)
            print(res_list)
            self.Refresh()
    
        def OnSelectComboBox(self,event):
    
            item = event.GetString()
    
    
            result_query_2 = cur.execute("Select symp, descrip, judgement,image from sa_er_ramp where symp='%s'" % item)
            rows = cur.fetchall()
            imageno = ""
    
            for row in rows:
                self.cas2_symp_text.SetLabel(row[0])
                self.cas2_descrip_text.SetLabel(row[1])
    
                imageno = row[3]
    
    
            # -- IMAGE
            print("Image selected:",imageno)
            #erim = Image.open('./image/image_error_ramp/%s.webp' % imageno)
            #erim.info.pop('background',None)
            #erim.save('./image/image_error_ramp/%s.gif' % imageno,save_all=True, loop=0)
            anim = Animation('./%s.gif' % imageno)
            ctrl = AnimationCtrl(self.Panel_err_image, -1,anim, pos=(35,40))
            ctrl.Play()
            #os.remove('./image/image_error_ramp/%s.gif' % imageno)
    
    
    if __name__=="__main__":
        app = MyApp(False)
        app.MainLoop()
    

    【讨论】:

    • 嗨。萨克森的罗尔夫。
    • 首先对迟到的回答感到抱歉。我从您的代码中找到了一个密钥并解决了它。真的感谢。你的鼓励对我来说是很大的力量......真的很感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多