Ich arbeite daran in einer kleinen tkinter GUI einen Kalender darzustellen, in dem man die Monate über Buttons durch klicken kann.
Nach anfänglichem Durcheinander habe ich dabei auf klassenoriente Programmierung gewechselt und versucht, die Logik von der GUI zu trennen.
Dabei habe ich nun ein Problem, da ich von der GUI aus nicht mehr meine Funktionen der Klasse 'darüber' aufrufen kann.
(File "...", line 43, in init_widgets
self.month_heading = Label(self.calendar_month_frame, text=GUI_Handler.get_text_for_month_heading())
NameError: name 'GUI_Handler' is not defined)
Ich habe den stark gekürzten Code unten dazukopiert, damit man (hoffentlich) mein Problem verstehen kann.
Wie sieht der richtige Aufruf der Funktion nun aus, wenn ich dabei bleiben möchte die Logik aus der GUI raus zu halten?
(In der Praxis halte ich die Klassen jeweils in eigenen Files, falls das irgendetwas ändert, was ich nicht glaube.)
Code: Alles auswählen
from tkinter import *
from datetime import date #eigentlich in timehandler
class Time_Handler(object):
MONTHS = {1:{'Name':'Jänner','Days':31}, 2: {'Name':'Februar', 'Days': 28}, 3: {'Name':'März', 'Days':31}, 4: {'Name':'April', 'Days': 30}, 5: {'Name':'Mai','Days': 31}, 6: {'Name':'Juni', 'Days': 30},
7: {'Name':'Juli','Days':31},8:{'Name':'August','Days':31}, 9: {'Name':'September','Days':30}, 10:{'Name':'Oktober','Days': 31}, 11:{'Name':'November','Days': 30}, 12:{'Name':'Dezember','Days': 31}}
def __init__(self):
self.month = date.today().month
self.year = date.today().year
self.shown_month=self.month
self.shown_year=self.year
def next_month(self):
self.shown_month +=1
if self.shown_month==13:
self.shown_month=1
self.shown_year +=1
def former_month(self):
self.shown_month -=1
if self.shown_month ==0:
self.shown_month=12
self.shown_year -=1
class GUI_Handler():
def __init__(self):
time_handling = Time_Handler()
root = Tk()
app = Input_Window(root)
root.mainloop()
def next_month(self):
time.next_month()
app.month_heading['text']=time.get_text_for_month_heading()
def former_month(self):
time.former_month()
app.month_heading['text']=time_handling.get_text_for_month_heading()
def get_text_for_month_heading():
return Time_Handler.MONTHS[time_handling.shown_month]['Name'] + ' ' + str(time_handling.shown_year)
class Input_Window(Frame):
def __init__(self, parent):
super(Input_Window, self).__init__(parent)
self.parent = parent
self.active=False
self.grid(row=0,column=0)
self.init_widgets()
def quit(self):
sys.exit()
def init_widgets(self):
self.calendar_month_frame=Frame(self)
self.calendar_month_frame.grid(column=0,row=0)
self.month_heading = Label(self.calendar_month_frame, text=GUI_Handler.get_text_for_month_heading())
self.button_former_month = Button(self.calendar_month_frame,text='<',command=GUI_Handler.former_month)
self.button_next_month = Button(self.calendar_month_frame,text='>',command=GUI_Handler.next_month)
self.button_former_month.grid(row=0,column=0)
self.month_heading.grid(row=0,column=1)
self.button_next_month.grid(row=0,column=2)
x=GUI_Handler()
Liebe und hoffnungsvolle Grüße