微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

insert() 方法似乎在子帧中失败

如何解决insert() 方法似乎在子帧中失败

我正在为数据库中的记录编写“更改”对话框。 相同数据记录的“输入数据”对话框(terminerfassen)工作正常。 为了重用尽可能多的现有代码,我为标签和值创建了一个类。 条目和文本小部件在每个程序中都重复。 对话框“terminAendern”(更改截止日期)以一个询问记录编号的小窗口开始。按“查找”(Daten einlesen) 按钮将打开与“输入数据”对话框外观相同的第二个窗口。 问题:虽然代码是一样写的,但它对主帧的Entry-Fields有效,对子帧的Entry字段无效。 但是,我不确定框架是罪魁祸首 - 似乎只是结构中不相同的单个项目。 这是代码。第 0 行到第 5 行填充了来自数据库的数据,单选按钮也可以工作,只是子框架中的条目有这个问题。还可以在下面找到屏幕图像。

class TerminAendern(te2.DatenFenster):
    "Termine können geändert werden. Erweiterung von terminerfassen"
    def __init__(self,el):
        "Übernimmt das Fenster aus dem Erfassungsdialog"
        super().__init__()
        self.ROOT.title("Termin ändern")
        # Datensatz-Nummer
        self.num_wrt = el["nummer"]
        # die Werte aus der Datenbank in das Fenster setzen

        #--------- row 0 -----------
        #self.art_wrt = tk.StringVar() # Operation zB backup,apt-update,extrahieren
        self.art_wrt.set(el["art"])
        self.ART_EING = tk.Entry(self.FRMEINGAB,textvariable=self.art_wrt,bg='white')
        self.ART_EING.grid(column=1,row=0)
        self.ART_EING.insert(0,el["art"])

        #--------- row 1 -----------
        #self.gertwrt = tk.StringVar() # Rechnername oder Gerät (BoschNyon)
        self.gertwrt.set(el["geraet"])
        self.GERTEING = tk.Entry(self.FRMEINGAB,textvariable=self.gertwrt,bg='white')
        self.GERTEING.insert(90,el["geraet"])
        self.GERTEING.grid(column=1,row=1)

        #--------- row 2 -----------
        #self.brchwrt = tk.StringVar() # Partition/Gegenstand/Aktion/'': TB2,Karten,apt-update
        self.brchwrt.set(el["bereich"])
        self.BRCHEING = tk.Entry(self.FRMEINGAB,textvariable=self.brchwrt,bg='white')
        self.BRCHEING.insert(0,el["bereich"])
        self.BRCHEING.grid(column=1,row=2)

        #--------- row 3 -----------
        #self.bescwrt = tk.StringVar() # Kurztext
        self.bescwrt.set(el["kurztext"])
        self.BESCEING = tk.Label(self.FRMEINGAB,textvariable=self.bescwrt,bg='lightblue',text=el["kurztext"],anchor=tk.W,relief=tk.RAISED)
        self.BESCEING.grid(column=1,row=3)

        #--------- row 4 -----------
        #self.haufwrt = tk.Intvar()    # Häufigkeit
        self.haufwrt.set(el["haeufigkeit"])
        self.HAUFEING = tk.Entry(self.FRMEINGAB,textvariable=self.haufwrt,bg='white')
        self.HAUFEING.insert(0,el["haeufigkeit"])
        self.HAUFEING.grid(column=1,row=4)

        #--------- row 5 -----------
        #self.ist_wrt = tk.StringVar() # Datum: Letzte Durchführung
        dbdatum = el["wann"]
        dbm = dbdatum.find("-",6)
        dbd = dbdatum[dbm+1:] + "." + str(dbdatum[5:dbm]) + "." + str(dbdatum[:4])
        self.IST_EING = tk.Entry(self.FRMEINGAB,textvariable=self.ist_wrt,bg='white')
        self.IST_EING.insert(0,dbd)
        self.IST_EING.grid(column=1,row=5)

        #--------- row 6 Frame 'Prüfung' -----------
        for val,txt in self.pruefwerte: # (int,str)
            if el["pruefen"] == txt:
                self.prufwrt.set(val)
                break
        self.PRUFEING = {} # leeres Dict
        for val,str)
            self.PRUFEING[val] = tk.Radiobutton(self.FRMPRUEFG,text=txt,padx=5,pady=2,variable=self.prufwrt,value=val)
            self.PRUFEING[val].grid(column=0,row=val+1,sticky=tk.W)
            if val == self.prufwrt.get():
                self.PRUFEING[val].select()
        #---- Prüfdatei ----
        if "testen" in el:
            self.testwrt.set(el["testen"])
        else:
            self.testwrt.set("")
        print("testwrt = " + self.testwrt.get())
        self.TESTEING = tk.Entry(self.FRMPRUEFG,textvariable=self.testwrt,bg='white')
        #self.TESTEING.delete(0,tk.END)
        self.TESTEING.insert(0,self.testwrt)
        self.TESTEING.grid(column=4,row=2)
        #--------- row 7 Frame 'Machen' -----------
        if el["machen"] == "manuell":
            self.machwrt.set(0)
            self.skrpwrt.set("")
        else:
            self.machwrt.set(1)
            self.skrpwrt.set(el["machen"])
        self.MACHEING = {} # leeres Dict
        for val,txt in self.machwerte:
            self.MACHEING[val] = tk.Radiobutton(self.FRMMACHEN,pady=3,variable=self.machwrt,value=val)
            self.MACHEING[val].grid(column=1,sticky=tk.W)
            if val == self.machwrt.get():
                self.MACHEING[val].select()
        #---- Arbeitsskript ----
        self.SKRPEING = tk.Entry(self.FRMMACHEN,textvariable=self.skrpwrt,bg='white')
        self.SKRPEING.insert(0,self.skrpwrt)
        self.SKRPEING.grid(column=4,row=2)
        #--------- row 8 -----------
        self.ANLTeing = tk.Text(self.FRMEINGAB,height=3,width=80,bg='white')
        self.ANLTeing.insert('1.0',el["anleitung"])
        self.ANLTeing.grid(column=1,row=8,columnspan=3)
        #------------ GRID = Alle aktivieren -----------
        self.FRMPRUEFG.grid(column=0,row=6,columnspan=5,sticky=tk.W)
        self.FRMMACHEN.grid(column=0,row=7,sticky=tk.W)
        self.FRMEINGAB.grid(row=0)
        #------------
        self.PROGENDEBUTTON = tk.Button(self.FRMSCHALT,text='Quit',bg="red",command=self.ROOT.quit)\
                                        .grid(row=0,column=4,sticky=tk.E,padx=20,pady=4)
        self.FRMSCHALT.grid(row=1)

class DatenAuswahl:
    "Fenster zur Auswahl des Datensatzes"
    def __init__(self):
        self.fenster = tk.Tk()
        self.fenster.title('Datensatz auswählen')
        self.MYFRAME = tk.Frame(self.fenster,borderwidth=5,relief=tk.RIDGE,pady=4)
        self.satznr = tk.Intvar()
        self.SATZNR_TXT = tk.Label(self.MYFRAME,text="Nummer des Termins ",pady=9)\
                          .grid(column=0,row=1,sticky=tk.W)
        self.SATZEIN = tk.Entry(self.MYFRAME,textvariable=self.satznr,bg='white')\
                       .grid(column=1,row=1)
        self.DATENBUTTON = tk.Button(self.MYFRAME,text="Daten einlesen",bg="lightblue",command=self.DatenLesen) #self.satznr ??
        self.DATENBUTTON.grid(column=0,row=3,pady=20)
        self.MYFRAME.grid(row=0)

    def DatenLesen(self):
        """Versucht,den Termin-Satz mit Nummer 'satznr' aus der Datenbank zu lesen,danach wird das Fenster zur Datenkorrektur geöffnet."""
        el = createTerminListe.terminAuslesen(int(self.satznr.get()))
        # Ausgabe der Werte auf demn Bildschirm
        for k in el.keys():
            print(k + " = " + str(el[k]))
        ausgabe = TerminAendern(el)

myprog = DatenAuswahl()
tk.mainloop()

基类中框架的定义很简单:

class DatenFenster:
    'Klasse zur Bearbeitung von Terminen'
    def __init__ (self):
        locale.setlocale(locale.LC_ALL,'de_DE.utf8')

        self.ROOT = tk.Tk()
        self.ROOT.title("Termin erfassen")
        self.FRMEINGAB = tk.Frame(self.ROOT,pady=4)
        self.FRMPRUEFG = tk.Frame(self.FRMEINGAB,borderwidth=2,relief=tk.RIDGE)
        self.FRMMACHEN = tk.Frame(self.FRMEINGAB,relief=tk.RIDGE)
        self.FRMSCHALT = tk.Frame(self.ROOT,borderwidth=4,relief=tk.RAISED,pady=4,padx=6,bg="orange")
--etc.---

'terminAendern' window

'Prüfdatei (Pfad)' 中的条目填充了认值,而不是数据库中提供的值。

我不知道在哪里可以进一步查看(除了 tk 源,我不确定我是否可以掌握)。 如果有人能告诉我我错过了什么,我会很高兴。

解决方法

我自己找到了问题的根源。 首先,在一个 Tk() 中创建的 StringVar() 在另一个 Tk() 中不可见: see here。 当然,我在我的代码中检测到了这个问题。 我现在有两种解决方法: (1) 使我的“更改”对话框和“输入”对话框成为两个单独的程序,即不重用代码。我并不打算这样做,但它可能会让我更快地找到一个正在运行的解决方案。 (2) 使用 Toplevel()。这样可以让我保持原来的程序依赖,避免重复代码,但是目前我没有找到很多关于多窗口编程的解释。反正我的问题就算没解决也说明了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?