Етикетът в диалогов прозорец не актуализира всяко пускане на щракване върху бутон Основен прозорец (PyQt)

Проектирах в GUI с помощта на QtDesigner (в eric4). Току-що направих Qlabel като контейнер, който е предназначен да се актуализира с най-новия идентификатор, който има достъп до SQLite база данни, която изграждам. Искам setlabel да се промени на следващия наличен слот в първичния ключ на ID, така че направих клас и def в отделен py файл:

class AccessMem:
def LastRowID(self):
    con = sqlite3.connect("Members.db") #access database
    cur = con.cursor()  #cursor object for database

    #created if first time to make a table
    try: 
        cur.execute('create table Members (ID integer primary key autoincrement not null, Nick string not null, NameFirst string, NameMiddle string, NameLast string, BirthMonth string, BirthDay string, BirthYear string, ContactNum string, EMail string, MailAdd string, MemberSince string)')
    except:
        pass

    #only to get the value of NextID to display
    TempNick = "ThisIsADummyNickToBeDeleted"        
    cur.execute("insert into Members (Nick) values (?)", (TempNick, ))
    NextID = cur.lastrowid 
    cur.execute("delete from Members where ID = ?",  (NextID, ))

    return NextID
    cur.close()
    con.close()

След това модифицирах компилирания UI формуляр и добавих тези в горната част (където отделният py файл на функцията AccessMem е memberinfo.py):

from memberinfo import *

IDL = AccessMem()
IDLabel = `IDL.LastRowID()`

И след това промених частта def retranslateUi, където дисплеят трябва да бъде променен на това:

self.ID_Number.setText(IDLabel)

така че да може да показва кога диалоговият прозорец ще се отвори.

Проблемът е, че всеки път, когато стартирам програмата и в главния прозорец, стартирам за този диалогов прозорец, показването на ID_Number не се актуализира в диалоговия прозорец. Всеки път, когато затворя програмата, стартирам я отново, след което щракнах отново върху главния прозорец, за да стартирам диалоговия прозорец, за да се актуализира показването на ID_Number.

За всеки случай, ето части от диалоговия код в главния прозорец, които добавих, за да стартирам диалоговия прозорец: В горната част добавих:

from ui.newmember import NewMember

След това при щракнато събитие AddMember:

    def on_AddMember_clicked(self):
    """
    Slot documentation goes here.
    """
    # Open New Member window
    self.NM = NewMember()
    self.NM.show()

NewMember е името на класа в папката newmember.py в потребителския интерфейс.

Само отбелязвайки също, че в диалоговия прозорец NewMember той основно добавя нов набор от данни за базата данни sqlite. Ето части от диалоговия код на събитието, ако се щракне върху бутона Запазване:

    def on_button_Save_released(self):
    """
    Slot documentation goes here.
    """
    Nik = unicode(self.LineEdit_Nickname.text())
    NFirst = unicode(self.LineEdit_NameFirst.text())
    NMid = unicode(self.LineEdit_NameMiddle.text())
    NLast = unicode(self.LineEdit_NameLast.text())
    BMon = unicode(self.ComboBox_BirthMonth.currentText())
    BDay = unicode(self.ComboBox_BirthDay.currentText())
    BYear = unicode(self.ComboBox_BirthYear.currentText())
    CNum = unicode(self.LineEdit_ContactNum.text())
    EM = unicode(self.LineEdit_EMail.text())
    MAd = unicode(self.LineEdit_MailAdd.text())

    self.NMem = NewMem()
    self.NMem.input_data(Nik,  NFirst, NMid,  NLast,  BMon,  BDay,  BYear,  CNum,  EM,  MAd)
    self.close()

Методът input_data е в отделен py файл и изглежда така:

class NewMem:
def input_data(self,  Nik,  NFirst, NMid,  NLast,  BMon,  BDay,  BYear,  CNum,  EM,  MAd):

    con = sqlite3.connect("Members.db") #access database
    cur = con.cursor()  #cursor object for database

    def adapt_datetime(ts):
        return time.mktime(ts.timetuple())

    #Get current time and date
    sqlite3.register_adapter(datetime.datetime, adapt_datetime) 
    now = datetime.datetime.now()  

    #created if first time to make a table
    try: 
        cur.execute('create table Members (ID integer primary key autoincrement not null, Nick string not null, NameFirst string, NameMiddle string, NameLast string, BirthMonth string, BirthDay string, BirthYear string, ContactNum string, EMail string, MailAdd string, MemberSince string)')
    except:
        pass

    cur.execute("insert into Members (Nick,NameFirst,NameMiddle,NameLast,BirthMonth,BirthDay,BirthYear,ContactNum,EMail,MailAdd,MemberSince) values (?,?,?,?,?,?,?,?,?,?,?)",(Nik,  NFirst, NMid,  NLast,  BMon,  BDay,  BYear,  CNum,  EM,  MAd, now))

    con.commit()
    cur.close()
    con.close()

Така че, когато се щракне върху бутона „Запазване“ на диалоговия прозорец NewMember, прозорецът се затваря и sqlite е вмъкнал нов набор от данни. След това бутонът в главния прозорец за стартиране на прозореца NewMember, IDLabel трябва да се актуализира до най-новия ID на ред, но той все още не се актуализира.

Би ли било възможно да попитам как да реша това? Всяка помощ е много ценена дълбоко се покланям


person hyoumoku    schedule 01.03.2011    source източник


Отговори (1)


Добре, в крайна сметка намерих решението, след като си починах и поспах.

Току-що направих някои промени в компилираната форма на потребителския интерфейс, където тези

IDL = AccessMem()
IDLabel = `IDL.LastRowID()`

бяха първи най-отгоре, сега го поставих в метода на def retranslateUi и сега работи.

person hyoumoku    schedule 02.03.2011