修复:我将单选按钮的调用从视图的初始位置移到了控制器,如下所示:
class Controller(object):
def __init__(self):
self.model = Model()
print('start init of View')
self.view = View(self.importieren, self.exportieren, self.beenden, self.J5, self.J6, self.J7, self.J8, self.J9,
self.J10, self.J11, self.J12, self.JA, self.tabelle_sorti, self.hinzufugen, self.zuordnen,
self.ande, self.JA, self.model.ausgabe('projekte'), self.tabelle_update, self.a1, self.a2, self.a3,
self.a4, self.a5, self.a6, self.a7)
print('done init')
self.wahlen = ('sErst', 'sZweit', 'sDritt')
self.delimiter = {'imp_s': None, 'imp_p': None, 'exp': None}
self.dchosen = None
self.slcsv = 'schuelerliste.csv'
self.plcsv = 'projektliste.csv'
self.double = False
self.andernx = ""
self.view.radios['jahrg-Alle'].invoke()
self.tabelle()
self.view.table['main'].bind('<Double-Button-1>', self.treevent)
# Erstimportierung
if self.model.ausgabe('schueler'):
self.importieren(True)
self.view.mainloop()
def tabelle_update(self, fetchshlr=None, fetchprj=None):
print('start update')
if fetchshlr is None:
fetchshlr = self.model.ausgabe('schueler')
if fetchprj is None:
fetchprj = self.model.ausgabe('projekte')
self.view.tableup(fetchshlr, fetchprj)
在View准备就绪之前,此调用称为函数,因此导致了错误。感谢您的帮助,
我尝试不问任何问题,但是经过数小时的搜索,我不得不这样做。我目前正在编写程序,最近将主文件按照MVC方案的样式分为三个部分。我有一个功能来更新作为表工作的Treeview。但是这个功能(只有那个!)说:
Exception in Tkinter callback\
Traceback (most recent call last):\
File "C:\Users\...\Python38\lib\tkinter\__init__.py", line 1883, in __call__\
return self.func(*args)\
File "C:/Users/.../Controller.py", line 184, in tabelle_update\
self.view.table['main'].tag_configure(i[0], background='white')\
AttributeError: 'Controller' object has no attribute 'view'
我已经尝试过使用lambda(如果您问为什么,因为有人在互联网上说过),它根本无法使用该功能。我也认为这与此有关:
{'model': <Model.Model object at 0x0000018CA8068160>, 'view': <View.View object .>, ...}
这是字典属性的摘录,我认为它与0x处的缺失有关...在“视图”中的一部分(如在“模型”中所见)
请帮助我启动并运行
这是我重要的代码部分(如果需要,请写),请
注意,diffrent类位于diffrent文件中,并且已正确导入
在tabelle_update和View类表格下的programmcode中,我尝试将View的重要部分移至View,但未进行任何重大更改。
class Controller(object):
def __init__(self):
self.model = Model()
self.view = View(self.importieren, self.exportieren, self.beenden, self.J5, self.J6, self.J7, self.J8, self.J9,
self.J10, self.J11, self.J12, self.tabelle_update, self.tabelle_sorti, self.hinzufugen,
self.zuordnen, self.ande, self.tabelle_update, self.model.ausgabe('projekte'),
self.tabelle_update, self.a1, self.a2, self.a3, self.a4, self.a5, self.a6, self.a7)
self.wahlen = ('sErst', 'sZweit', 'sDritt')
self.delimiter = {'imp_s': None, 'imp_p': None, 'exp': None}
self.dchosen = None
self.slcsv = 'schuelerliste.csv'
self.plcsv = 'projektliste.csv'
self.double = False
self.andernx = ""
self.tabelle()
self.view.table['main'].bind('<Double-Button-1>', self.treevent)
# Erstimportierung
if self.model.ausgabe('schueler'):
self.importieren(True)
print(self.__dict__)
self.view.mainloop()
def tabelle(self):
fetch = self.model.ausgabe('schueler')
self.view.shlr_tabelle(fetch)
def tabelle_update(self, fetchshlr=None, fetchprj=None):
print('start update')
if fetchshlr is None:
fetchshlr = self.model.ausgabe('schueler')
if fetchprj is None:
fetchprj = self.model.ausgabe('projekte')
self.view.tableup(fetchshlr, fetchprj)
class View(ttkthemes.ThemedTk):
def __init__(self, imp, exp, bee, j5, j6, j7, j8, j9, j10, j11, j12, ja, tabsort, hin, zord, ande, scht,
prjt, aktutable, a1, a2, a3, a4, a5, a6, a7):
# print(ttkthemes.THEMES) # zum Ausgeben der verfügbaren Themes
ttkthemes.ThemedTk.__init__(self, theme='breeze')
self.title("Projektwochenverwaltungsprogramm")
self.geometry('800x300')
self.minsize(800, 300)
self.resizable(width=True, height=True)
# bestimmen der Callbacks
self.callback_imp = imp
self.callback_exp = exp
self.callback_bee = bee
self.radiocom = {'jahrg': [j5, j6, j7, j8, j9, j10, j11, j12, ja], 'ande': [a1, a2, a3, a4, a5, a6, a7]}
self.tabelle_sorti = tabsort
self.callback_aktut = aktutable
self.callback_zord = zord
self.callback_hin = hin
self.callback_ande = ande
self.callback_scht = scht
self.callback_prjt = prjt
# Tabelle
self.scrollbars = {'main': Scrollbar(self.rahmen[2], orient="vertical")}
self.table = {'main': Treeview(self.rahmen[2], yscrollcommand=self.scrollbars['main'].set, height=200)}
self.scrollbars['main'].pack(side=RIGHT, fill=BOTH)
self.rahmen[1].pack()
self.rahmen['popup_pro'].pack(fill=X)
self.rahmen[2].pack(fill=BOTH, expand=True)
def shlr_tabelle(self, fetch):
ml = ['ID']
for name in self.names['schueler']:
ml.append(name)
ml.append('Zugeordned zu')
self.table['main']['columns'] = ml
self.table['main']['show'] = 'headings'
for i in range(len(ml)):
self.table['main'].column(ml[i], width=self.width['schueler'][i], minwidth=self.width['schueler'][i])
for i in range(len(ml)):
self.table['main'].heading(ml[i], text=ml[i], command=lambda col=i: self.tabelle_sorti(col, False, 'main'))
for t in fetch:
self.table['main'].insert('', t[0], t[0], values=t) # , tags=t[0]
self.scrollbars['main'].config(command=self.table['main'].yview)
self.table['main'].pack(fill=BOTH)
def prj_tabelle(self, fetch):
self.top['prjt'] = Toplevel()
self.top['prjt'].title('Projekte Liste')
self.top['prjt'].geometry('800x300')
self.top['prjt'].minsize(800, 300)
self.scrollbars['prj'] = Scrollbar(self.top['prjt'], orient="vertical")
self.table['prj'] = Treeview(self.top['prjt'], yscrollcommand=self.scrollbars['prj'].set, height=200)
ml = ['ID']
for name in self.names['projekte']:
ml.append(name)
self.table['prj']['columns'] = ml
self.table['prj']['show'] = 'headings'
for i in range(len(ml)):
self.table['prj'].column(ml[i], width=self.width['projekte'][i], minwidth=self.width['projekte'][i])
for i in range(len(ml)):
self.table['prj'].heading(ml[i], text=ml[i], command=lambda col=i: self.tabelle_sorti(col, False, 'prj'))
for t in fetch:
self.table['prj'].insert('', t[0], t[0], values=t) # , tags=t[0]
self.scrollbars['prj'].config(command=self.table['prj'].yview)
self.scrollbars['prj'].pack(side=RIGHT, fill=BOTH)
self.table['prj'].pack(fill=BOTH)
def tableup(self, fetchshlr, fetchprj):
print('läuft')
for i in fetchshlr:
self.view.table['main'].tag_configure(i[0], background='white')
self.view.table['main'].delete(*self.view.table['main'].get_children())
for t in fetchshlr:
self.view.table['main'].insert('', t[0], t[0], values=t) # , tags=t[0]
for ele in fetchshlr:
if ele[8] is None:
self.view.table['main'].tag_configure(ele[0], background='#fa6150')
try:
for i in fetchprj:
self.view.table['prj'].tag_configure(i[0], background='white')
self.view.table['prj'].delete(*self.view.table['prj'].get_children())
for t in fetchprj:
self.view.table['prj'].insert('', t[0], t[0], values=t) # , tags=t[0]
failed = self.model.prj_aktu()
for prj in failed:
self.view.table['prj'].tag_configure(prj, background='#fa6150')
except KeyError:
pass
您必须问问自己何时self.view
完全初始化,以及何时尝试访问self.view
。该错误告诉您在定义它之前您正在尝试访问它。
您应该能够通过添加如下打印语句来形象地看到这一点:
print("before self.view is defined")
self.view = View(...)
print("after self.view is defined")
接着:
print("using self.view...")
self.view.table['main'].tag_configure(i[0], background='white')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句