如何解决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.---
'Prüfdatei (Pfad)' 中的条目填充了默认值,而不是数据库中提供的值。
我不知道在哪里可以进一步查看(除了 tk 源,我不确定我是否可以掌握)。 如果有人能告诉我我错过了什么,我会很高兴。
解决方法
我自己找到了问题的根源。 首先,在一个 Tk() 中创建的 StringVar() 在另一个 Tk() 中不可见: see here。 当然,我在我的代码中检测到了这个问题。 我现在有两种解决方法: (1) 使我的“更改”对话框和“输入”对话框成为两个单独的程序,即不重用代码。我并不打算这样做,但它可能会让我更快地找到一个正在运行的解决方案。 (2) 使用 Toplevel()。这样可以让我保持原来的程序依赖,避免重复代码,但是目前我没有找到很多关于多窗口编程的解释。反正我的问题就算没解决也说明了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。