Метка в диалоговом окне не обновляет каждое нажатие кнопки Главное окно (PyQt) - PullRequest
1 голос
/ 02 марта 2011

Я разработал в графическом интерфейсе с использованием QtDesigner (на eric4). Я только что создал Qlabel в качестве заполнителя, который предназначен для обновления с использованием новейшего идентификатора, имеющего доступ к базе данных SQLite, которую я создаю.Я хочу, чтобы setlabel изменился на следующий слот, доступный в первичном ключе ID, поэтому я создал класс и определился в отдельном файле 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()

Затем я изменил скомпилированную форму пользовательского интерфейса и добавил их вtop (где отдельный 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 должен быть обновлен до последнего идентификатора строки, но он все еще не обновился сам.

Можно ли спросить, как решить эту проблему?Любая помощь очень ценится глубоко кланяется

1 Ответ

0 голосов
/ 02 марта 2011

Хорошо, я нашел решение после того, как немного отдохнул и уснул.

Я только что сделал некоторые изменения в скомпилированной форме пользовательского интерфейса, где эти

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

были первыми на самом верху, теперь я поместил их в метод def retranslateUi, и теперь он работает.

...