【问题标题】:Label in a dialog window does not update every release of click of button Main Window (PyQt)对话框窗口中的标签不会更新每次单击按钮主窗口(PyQt)的释放
【发布时间】:2011-07-06 20:54:57
【问题描述】:

我使用 QtDesigner(在 eric4)在 GUI 中进行了设计我刚刚制作了一个 Qlabel 作为占位符,旨在使用可以访问我正在构建的 SQLite 数据库的最新 ID 进行更新。我希望它设置标签以更改为 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()

然后我修改了编译好的 UI 表单,并在顶部添加了这些(AccessMem 函数的单独 py 文件是 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 是 ui 文件夹中 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,但它仍然没有自行更新。

请问如何解决这个问题?非常感谢任何帮助深深鞠躬

【问题讨论】:

    标签: python sqlite pyqt qt-designer


    【解决方案1】:

    好的,我在休息和睡觉后终于找到了解决方案。

    我只是在编译后的 UI 表单中做了一些更改

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

    最初在最上面,我现在把它放在def retranslateUi的方法中,它现在可以工作了。

    【讨论】:

      猜你喜欢
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2019-07-31
      相关资源
      最近更新 更多