Проблема с переданным значением и выпадающим списком на wxPython - PullRequest
0 голосов
/ 08 марта 2020

Привет, я wx python newb ie. и за неделю до того, как я загрузил свой вопрос и еще не решил.

, поэтому сегодня мне нужна дополнительная помощь по моей проблеме

, поэтому вот код ....

# -*- 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. поиск "связать модель" и привязку кнопки к событию (чтобы получить спецификацию c название модели)
  3. выберите «модель» из списка привязки listctrl к событию (чтобы получить элементы в выпадающем списке)
  4. и заполните список в выпадающем списке соответствующим списком (список выводится из sqlie )
  5. выберите элемент комбинированного списка и отобразится соответствующее изображение (изображение является анимированным GIF)

и ниже моя проблема

  1. , когда я выберите список со списком и анимированный GIF воспроизводится на панели. и выберите другой элемент комбинированного списка: анимированный GIF-проигрыватель, другой - изображение перекрывается

  2. ниже кода ... преобразование изображения и код воспроизведения ... я называю этот код "ИЗОБРАЖЕНИЕ" (я сохранил все Анимированный GIF в webp и конвертирование в gif в этот раз конструктор есть.)

        # 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
    
  3. и здесь (ниже кода конструктора) я не могу получить imageno (imageno - это имя изображения. И это имя взято из sqlite, поэтому я выбираю элемент из выпадающего списка, но не могу получить ответ от выпадающего списка)

  4. , и моя проблема заключается в следующем

    • Могу ли я получить имя изображения из sqlite ниже кода конструктора с помощью выпадающего списка?

    • или иным образом в исходном месте (ниже аннотации «ИЗОБРАЖЕНИЕ») любого кода для «Анимированный GIF не перекрывается» ?

    пс. неделя go Робин Данн и Вольф Саксонии учат меня этой проблеме, но я не могу понять и очень подавлен .....

    Имейте Niceday

1 Ответ

0 голосов
/ 08 марта 2020

Сложно понять, с чего начать с этого ответа, потому что есть ошибки кодирования, логические ошибки, и я не знаю, как выглядят данные.
Однако некоторые вещи выделяются.

  • запросам sqlite требуется fetch для возврата строки / строк
    используйте fetchone (), fetchmany (n) или fetchall ()
  • При тестировании print() Ваш друг, если вы не используете IDE
    , напечатайте результат (ы), чтобы проверить, что вы ожидаете
  • Всегда предполагайте, что могла произойти ошибка, проверьте с помощью if или попробуйте, например,
  • Инициализируйте переменные, особенно если вы устанавливаете их в операторе if
    Предположим, что тест может не пройти.

Тем не менее, я приветствую ваше отношение go for it, но вы могли бы сделать это в меньших шагах. Изучите каждый шаг, прежде чем пытаться соединить их все.

Вот версия вашего кода, которая сопровождается множеством предостережений.
Я не знаю ваших данных или структуры данных.
У меня есть начал с создания фиктивных записей в моей базе данных.
Я не знаю ваших целей или логики c.
Были рассмотрены только те проблемы, которые мне нужно было решить, чтобы получить в основном работающую программу, и я убрал некоторый код из обработки изображений, чтобы помочь мне, а не вам.
Надеюсь, вы найдете некоторые преимущества в приведенном ниже коде.
Я рекомендую использовать «diff» в моем коде по сравнению с вашим, чтобы увидеть, что изменилось.

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()

enter image description here

...