1

我使用 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,但它仍然没有更新自身。

可以问一下这个怎么解决吗?任何帮助都非常感谢深深鞠躬

4

1 回答 1

0

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

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

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

首先在最上面,我现在把它放在方法里面def retranslateUi,它现在可以工作了。

于 2011-03-02T02:57:05.883 回答