2016-09-06 126 views
0

我有2個班,我創建的每一個類的實例這樣Python的Tkinter的2類

if __name__ == '__main__': 
    root = Tk() 
    w, h = root.winfo_screenwidth(), root.winfo_screenheight() 
    root.focus_set() # <-- move focus to this widget 
    root.geometry("%dx%d+0+0" % (w, h)) 
    root.title("Circus ticketing system") 

    UI_Class = GUI(root) 
    Program_Class = Program() 

    root.mainloop() 

我設置的GUI變量是這樣的:

self.tenAmShowBtn = Button(self.fMain,text='10am Show',command=Program_Class.tenAmShow) 
     self.tenAmShowBtn.grid(column=0,row=2) 

和訪問變量(如從程序)GUI我這樣做:

UI_Class.tenAmShowBtn.config(bg='#00f0ff') 

,但我不斷收到這樣的錯誤NameError: name 'UI_Class' is not definedNameError: name 'Program_Class' is not definedAttributeError: 'GUI' object has no attribute 'tenAmShowBtn'我不明白我該怎麼做,程序類連續不斷地訪問GUI並編輯變量和小部件,但我無法訪問變量,在出錯後不斷收到錯誤,它是炒作當我把所有內容放在1個班級中時,我都感覺不到,因此我無法使用2個班級進行操作。

我把整個代碼,因爲我不能解釋的代碼,我aplogise。

try: 
    # for Python2 
    from Tkinter import * 
except ImportError: 
    # for Python3 
    from tkinter import * 
from random import randint 
#from user import Program 
class GUI: 
    def __init__(self, parent): 
     self.seats_being_bought1 = IntVar()#Light-Blue buttons number for textvariable 
     self.seats_being_bought1.set(0) 
     self.seats_being_bought2 = IntVar()#Light-Blue buttons number for textvariable 
     self.seats_being_bought2.set(0) 
     self.seats_being_bought3 = IntVar()#Light-Blue buttons number for textvariable 
     self.seats_being_bought3.set(0) 
     self.available_seats1 = IntVar() #Non-red buttons 
     self.available_seats1.set("0") 
     self.available_seats2 = IntVar() #Non-red buttons 
     self.available_seats2.set(0) 
     self.available_seats3 = IntVar() #Non-red buttons 
     self.available_seats3.set(0) 
     self.pricePerTicket1 = IntVar() 
     self.pricePerTicket1.set(5) 
     self.pricePerTicket2 = IntVar()#<> Ticket/Seat Price Variables 
     self.pricePerTicket2.set(5) 
     self.pricePerTicket3 = IntVar() 
     self.pricePerTicket3.set(12) 
     self.totalPrice1 = IntVar() 
     self.totalPrice1.set(0) 
     self.totalPrice2 = IntVar()#total price variables 
     self.totalPrice2.set(0) 
     self.totalPrice3 = IntVar() 
     self.totalPrice3.set(0) 
     self.totalTicketsSold = IntVar()#Total seats sold 
     self.totalTicketsSold.set(0) 
     self.totalIncome = IntVar()#Total income 
     self.totalIncome.set(0) 
     self.white = '#ffffff' #save time 
     self.currentShow = StringVar()#currrent show 
     self.instructions_text = 'Select the show you desire, then click one of the seats to the right and click the buy button' 
     self.button_list1={} #all seats(Buttons)as matrix/object 
     self.button_list2={} 
     self.button_list3={} 
     self.total_seats1 = StringVar() 
     self.total_seats2 = StringVar() 
     self.total_seats3 = StringVar() 
     self.total_seats1.set('/250') 
     self.total_seats2.set('/150') 
     self.total_seats3.set('/150') 
     self.selected_button_list1=[] #Light-Blue buttons 
     self.selected_button_list2=[] #Light-Blue buttons 
     self.selected_button_list3=[] #Light-Blue buttons 
     self.previousTransactionButtonList1 = []#List of Seats in the last transaction 
     self.previousTransactionButtonList2 = [] 
     self.previousTransactionButtonList3 = [] 
     self.automatic_seat_selection_no = IntVar()#automatic seat selection number 
     self.automatic_seat_selection_no.set(0) 
     self.f1 = Frame(parent) #Frame for Seats/Buttons 
     self.seatTitle = Label(self.f1,bg=self.white,textvariable=self.currentShow).grid(row=0,column=0,columnspan=11,sticky=E+W) 
     self.f1.grid(column=2,row=0) 
     self.f2 = Frame(parent) #Frame for Seats/Buttons 
     self.seatTitle = Label(self.f2,bg=self.white,textvariable=self.currentShow).grid(row=0,column=0,columnspan=11,sticky=E+W) 
     self.f2.grid(column=2,row=0) 
     self.f3 = Frame(parent) #Frame for Seats/Buttons 
     self.seatTitle = Label(self.f3,bg=self.white,textvariable=self.currentShow).grid(row=0,column=0,columnspan=11,sticky=E+W) 
     self.f3.grid(column=2,row=0) 

     self.f2.grid_remove() #Hide other 2 frames 
     self.f3.grid_remove() #Hide other 2 frames 

     #self.create_UI(parent) 
     #START WITH 10AM SHOW 
     #self.currentShow.set('10Am Show') 
     #self.tenAmShowBtn.config(bg='#00f0ff') 
     Program.tenAmShow(Program) 
     Program.displaySeats(10)#10 refers to 10am show 
     #CREATING OTHER SEATS BUT THEIR FRAMES ARE HIDDEN 
     Program.displaySeats(3) 
     Program.displaySeats(8) 

    def create_UI(self,parent): 
     self.fMain = Frame(parent)#Frame for rest of program 

     fLegend = Frame(self.fMain)#Frame for Legend 
     legendLabel = Label(fLegend,text='Legend').grid(column=0,row=0,columnspan=3,sticky=E+W) 
     legendRed = Label(fLegend,text='seat123',fg='#ff0000',bg='#ff0000').grid(column=0,row=1,sticky=E+W) 
     legendRed1 = Label(fLegend,text=' =').grid(column=1,row=1) 
     legendRed2 = Label(fLegend,text='Taken Seat').grid(column=2,row=1) 
     legendLightRed = Label(fLegend,text='seat123',fg='#f99999',bg='#f99999').grid(column=0,row=2,sticky=E+W) 
     legendLightRed1 = Label(fLegend,text=' =').grid(column=1,row=2) 
     legendLightRed2 = Label(fLegend,text='Bought Seat').grid(column=2,row=2) 
     legendLightBlue = Label(fLegend,text='seat123',fg='#00f0ff',bg='#00f0ff').grid(column=0,row=3,sticky=E+W) 
     legendLightBlue1 = Label(fLegend,text=' =').grid(column=1,row=3) 
     legendLightBlue2 = Label(fLegend,text='Selected Seat').grid(column=2,row=3) 
     fLegend.grid(column=0,row=0,columnspan=3) 
     #end Legend frame 
     self.instructions = Label(self.fMain, text=self.instructions_text).grid(column=0,row=1,columnspan=3) 
     #Show Selection gui 
     self.tenAmShowBtn = Button(self.fMain,text='10am Show',command=Program_Class.tenAmShow) 
     self.tenAmShowBtn.grid(column=0,row=2) 
     self.threePmShowBtn = Button(self.fMain,text='3pm Show',command=Program_Class.threePmShow) 
     self.threePmShowBtn.grid(column=1,row=2) 
     self.eightPmShowBtn = Button(self.fMain,text='8Pm Show',command=Program_Class.eightPmShow) 
     self.eightPmShowBtn.grid(column=2,row=2) 
     #Purchase details and commands gui 
     self.seat_amountLabel = Label(self.fMain, text='Amount of seats Available').grid(column=0, row=3) 
     self.seat_amountEntry = Label(self.fMain, textvariable=self.available_seats1,bg="#444444",fg='#ffffff',anchor=E) 
     self.seat_amountEntry.grid(column=1,row=3,sticky=E+W) 
     self.seat_amountTotal = Label(self.fMain,textvariable=self.total_seats1 ,bg='#444444',fg='#ffffff',anchor=W) 
     self.seat_amountTotal.grid(column=2,row=3,sticky=E+W) 
     self.seatsBeingBoughtLabel = Label(self.fMain,text='Amount of seats being purchased').grid(column=0,row=4) 
     self.seatsBeingBoughtVal = Label(self.fMain, textvariable=self.seats_being_bought1,bg="#444444",fg='#ffffff') 
     self.seatsBeingBoughtVal.grid(column=1,row=4,columnspan=2,sticky=E+W) 
     #price per ticket 
     self.pricePerTicketLabel = Label(self.fMain,text='Cost per Ticket/Seat in $').grid(column=0,row=5) 
     self.pricePerTicketVal = Label(self.fMain,textvariable=self.pricePerTicket1,bg='#ffffff',fg='#444444') 
     self.pricePerTicketVal.grid(column=1,row=5,columnspan=2,sticky=E+W) 
     #total price 
     self.totalPriceLabel = Label(self.fMain,text='Total Price in $').grid(column=0,row=6) 
     self.totalPriceVal = Label(self.fMain,textvariable=self.totalPrice1,bg='#ffffff',fg='#444444') 
     self.totalPriceVal.grid(column=1,row=6,columnspan=2,sticky=E+W) 
     #Automatically select seats 
     self.auto_seat_selection_label = Label(self.fMain,text='Amount of seats to buy:').grid(column=0,row=7) 
     self.auto_seat_selection_entry = Entry(self.fMain, textvariable=self.automatic_seat_selection_no).grid(column=1,row=7,columnspan=2,sticky=E+W) 
     #cancel and purchase button 
     self.resetBtn = Button(self.fMain,text="Cancel/Reset",bg='#ff0000',command=Program_Class.CancelTransaction).grid(column=0,row=8,columnspan=1,sticky=E+W) 
     self.buyTicketsBtn = Button(self.fMain,text="Buy ticket",bg='#00f0ff',command=Program_Class.click_function).grid(column=1,row=8,columnspan=2,sticky=E+W) 
     #totals 
     self.totalTicketsSoldLabel = Label(self.fMain,text='Total tickets sold:').grid(column=0,row=9) 
     self.totalTicketsSoldVal = Label(self.fMain,textvariable=self.totalTicketsSold).grid(column=1,row=9,columnspan=2) 
     self.totalIncomeLabel = Label(self.fMain,text='Total Income for the Day in $:').grid(column=0,row=10) 
     self.totalIncomeVal = Label(self.fMain,textvariable=self.totalIncome).grid(column=1,row=10,columnspan=2) 

     self.fMain.grid(column=1,row=0,sticky=N)  

class Program: 
    def __init__(self): 
     print('test') 
    def click_function(self): #Buy Button click 
     show = self.currentShow.get() 
     action = 0 
     inputed_seat = self.automatic_seat_selection_no.get() 
     #for automatic seat selection 
     if(inputed_seat != 0): 
      if(show == '10Am Show'): 
       button_list = self.button_list1 
       available_seats = self.available_seats1.get() 
      elif(show == '3Pm Show'): 
       button_list = self.button_list2 
       available_seats = self.available_seats2.get() 
      else: 
       button_list = self.button_list3 
       available_seats = self.available_seats3.get() 

      counter_var = 1 
      seat = 1 
      while counter_var <= inputed_seat:#i use while loop instead of for loop so i can continue/extend the loop if i find a taken/red seat 
       if(inputed_seat > available_seats): 
        print('Not enough seats available') 
        break 
       else: 
        if seat in button_list: 
         if(button_list[seat]['bg'] != '#f99999' and button_list[seat]['bg'] != '#00f0ff'): 
          self.SeatClick(seat) 
         else: 
          counter_var -= 1 
        else:#seat is taken/red 
         if(available_seats == 0): 
          print('Not enough seats available') 
          break 
         else: 
          counter_var -= 1 
        counter_var += 1 
        seat += 1 
       self.automatic_seat_selection_no.set(0) 
      self.click_function() 

     else:#for manual seat selection 
      if(show == '10Am Show'): 
       action = len(self.selected_button_list1) 
      elif(show == '3Pm Show'): 
       action = len(self.selected_button_list2) 
      else: 
       action = len(self.selected_button_list3) 
      if(action != 0): 
       if(show == '10Am Show'): 
        del self.previousTransactionButtonList1[:]#Clear last transaction 
        for i in range(len(self.selected_button_list1)): 
         self.button_list1[self.selected_button_list1[i]].config(bg='#f99999') 
         self.available_seats1.set(self.available_seats1.get() - 1) 
         #save to previous transactions 
         self.previousTransactionButtonList1.append(self.button_list1[self.selected_button_list1[i]]) 
        self.selected_button_list1 = [] 
        self.seats_being_bought1.set(0) 
        self.totalPrice1.set(0) 
       elif(show == '3Pm Show'): 
        del self.previousTransactionButtonList2[:]#Clear last transaction 
        for i in range(len(self.selected_button_list2)): 
         self.button_list2[self.selected_button_list2[i]].config(bg='#f99999') 
         self.available_seats2.set(self.available_seats2.get() - 1) 
         #save to previous transactions 
         self.previousTransactionButtonList2.append(self.button_list2[self.selected_button_list2[i]]) 
        self.selected_button_list2 = [] 
        self.seats_being_bought2.set(0) 
        self.totalPrice2.set(0) 
       else: 
        del self.previousTransactionButtonList3[:]#Clear last transaction 
        for i in range(len(self.selected_button_list3)): 
         self.button_list3[self.selected_button_list3[i]].config(bg='#f99999') 
         self.available_seats3.set(self.available_seats3.get() - 1) 
         #save to previous transactions 
         self.previousTransactionButtonList3.append(self.button_list3[self.selected_button_list3[i]]) 
        self.selected_button_list3 = [] 
        self.seats_being_bought3.set(0) 
        self.totalPrice3.set(0) 
       #get total seats sold INITIAL ONLY, SPECIFIC FUNCTION AT END OF PROGRAM 
       self.resetVal() 
      else: 
       print('No Seats Selected!') 

    def CancelTransaction(self): 
     show = self.currentShow.get() 
     if(show == '10Am Show' and len(self.previousTransactionButtonList1) >= 1): 
      for x in range(len(self.previousTransactionButtonList1)): 
       self.previousTransactionButtonList1[x].config(bg='SystemButtonFace')#make button return to available color 
       self.available_seats1.set(self.available_seats1.get() + 1)#Adjust available seat counter 
       self.totalTicketsSold.set(self.totalTicketsSold.get() - 1) 
      self.resetVal() 
      del self.previousTransactionButtonList1[:]#delete/clear previous transaction 
     elif(show == '3Pm Show' and len(self.previousTransactionButtonList2) >= 1): 
      for x in range(len(self.previousTransactionButtonList2)): 
       self.previousTransactionButtonList2[x].config(bg='SystemButtonFace') 
       self.available_seats2.set(self.available_seats2.get() + 1)#Adjust available seat counter 
       self.totalTicketsSold.set(self.totalTicketsSold.get() - 1) 
      self.resetVal() 
      del self.previousTransactionButtonList2[:]#delete/clear previous transaction 
     elif(show == '8Pm Show' and len(self.previousTransactionButtonList3) >= 1): 
      for x in range(len(self.previousTransactionButtonList3)): 
       self.previousTransactionButtonList3[x].config(bg='SystemButtonFace') 
       self.available_seats3.set(self.available_seats3.get() + 1)#Adjust available seat counter 
       self.totalTicketsSold.set(self.totalTicketsSold.get() - 1) 
      self.resetVal() 
      del self.previousTransactionButtonList3[:]#delete/clear previous transaction 
     else: 
      print('no previous transaction found') 

    def seatCounter(self,taken,show): #to count available seats 
     if(show == 1): 
      self.available_seats1.set(self.available_seats1.get() - taken) 
     elif(show == 2): 
      self.available_seats2.set(self.available_seats2.get() - taken) 
     else: 
      self.available_seats3.set(self.available_seats3.get() - taken) 
    #just to initially update the variables 
    def resetVal(self): 
     ticketSold1 = 250 - self.available_seats1.get() 
     ticketSold2 = 150 - self.available_seats2.get() 
     ticketSold3 = 150 - self.available_seats3.get() 
     self.totalTicketsSold.set(ticketSold1 + ticketSold2 + ticketSold3) 
     self.totalIncome.set((ticketSold1 * 5) + (ticketSold2 * 5) + (ticketSold3 * 12)) 
#CLICK ON SEAT/BUTTON 
    def SeatClick(self,seat_no): 
     show = self.currentShow.get() 
     action = 0 
     if(show == '10Am Show'): 
      action = self.button_list1[seat_no]['bg'] 
     elif(show == '3Pm Show'): 
      action = self.button_list2[seat_no]['bg'] 
     elif(show == '8Pm Show'): 
      action = self.button_list3[seat_no]['bg'] 
     else: 
      return False 
     if(action == '#f99999'): 
      print('already bought') 
     else: 
      if(show == '10Am Show'): 
       if(seat_no in self.selected_button_list1):#IF Seat/Button already selected, then remove .after(1000, self.update_clock) 
        self.button_list1[seat_no].config(bg='SystemButtonFace') 
        self.selected_button_list1.remove(seat_no) 
        self.seats_being_bought1.set(str(len(self.selected_button_list1))) 
        self.totalPrice1.set(self.pricePerTicket1.get() * len(self.selected_button_list1)) 
       else: 
        self.button_list1[seat_no].config(bg='#00f0ff')#IF Seat/Button not selected then toggle it 
        self.selected_button_list1.append(seat_no) 
        self.seats_being_bought1.set(str(len(self.selected_button_list1))) 
        self.totalPrice1.set(self.pricePerTicket1.get() * len(self.selected_button_list1)) 
      elif(show == '3Pm Show'): 
       if(seat_no in self.selected_button_list2): 
        self.button_list2[seat_no].config(bg='SystemButtonFace')#IF Seat/Button already selected, then remove 
        self.selected_button_list2.remove(seat_no) 
        self.seats_being_bought2.set(str(len(self.selected_button_list2))) 
        self.totalPrice2.set(self.pricePerTicket2.get() * len(self.selected_button_list2)) 
       else: 
        self.button_list2[seat_no].config(bg='#00f0ff')#IF Seat/Button not selected then toggle it 
        self.selected_button_list2.append(seat_no) 
        self.seats_being_bought2.set(len(self.selected_button_list2)) 
        self.totalPrice2.set(self.pricePerTicket2.get() * len(self.selected_button_list2)) 
      else: 
       if(seat_no in self.selected_button_list3): 
        self.button_list3[seat_no].config(bg='SystemButtonFace')#IF Seat/Button already selected, then remove 
        self.selected_button_list3.remove(seat_no) 
        self.seats_being_bought3.set(str(len(self.selected_button_list3))) 
        self.totalPrice3.set(self.pricePerTicket3.get() * len(self.selected_button_list3)) 
       else: 
        self.button_list3[seat_no].config(bg='#00f0ff')#IF Seat/Button not selected then toggle it 613553 
        self.selected_button_list3.append(seat_no) 
        self.seats_being_bought3.set(len(self.selected_button_list3)) 
        self.totalPrice3.set(self.pricePerTicket3.get() * len(self.selected_button_list3)) 

# SHOW SELECTION 
    def tenAmShow(self): 
     UI_Class.tenAmShowBtn.config(bg='#00f0ff') 
     self.threePmShowBtn.config(bg=self.white) 
     self.eightPmShowBtn.config(bg=self.white) 
     self.currentShow.set('10Am Show') 
     self.seat_amountEntry.config(textvariable = self.available_seats1) 
     self.seatsBeingBoughtVal.config(textvariable=self.seats_being_bought1) 
     self.pricePerTicketVal.config(textvariable=self.pricePerTicket1) 
     self.totalPriceVal.config(textvariable=self.totalPrice1) 
     self.seat_amountTotal.config(textvariable=self.total_seats1) 
     self.f1.grid() 
     self.f2.grid_remove() 
     self.f3.grid_remove() 

    def threePmShow(self): 
     self.threePmShowBtn.config(bg='#00f0ff') 
     self.tenAmShowBtn.config(bg=self.white) 
     self.eightPmShowBtn.config(bg=self.white) 
     self.currentShow.set('3Pm Show') 
     self.seat_amountEntry.config(textvariable = self.available_seats2) 
     self.seatsBeingBoughtVal.config(textvariable=self.seats_being_bought2) 
     self.pricePerTicketVal.config(textvariable=self.pricePerTicket2) 
     self.totalPriceVal.config(textvariable=self.totalPrice2) 
     self.seat_amountTotal.config(textvariable=self.total_seats2) 
     self.f1.grid_remove() 
     self.f2.grid() 
     self.f3.grid_remove() 

    def eightPmShow(self): 
     self.eightPmShowBtn.config(bg='#00f0ff') 
     self.tenAmShowBtn.config(bg=self.white) 
     self.threePmShowBtn.config(bg=self.white) 
     self.currentShow.set('8Pm Show') 
     self.seat_amountEntry.config(textvariable = self.available_seats3) 
     self.seatsBeingBoughtVal.config(textvariable= self.seats_being_bought3) 
     self.pricePerTicketVal.config(textvariable=self.pricePerTicket3) 
     self.totalPriceVal.config(textvariable=self.totalPrice3) 
     self.seat_amountTotal.config(textvariable=self.total_seats3) 
     self.f1.grid_remove() 
     self.f2.grid_remove() 
     self.f3.grid() 

#BUTTON/SEAT CREATION AND DISPLAY 
    def createSeats(self,num_of_seats,frame_pointer): 
     col = num_of_seats/10 
     if(frame_pointer == 1): 
      seat_counter1 = 1 
      for x in range(int(col)): 
       X = x + 10 
       for y in range(1, 11): 
        taken_seats = randint(1,3) 
        if(taken_seats == 3): 
         b1 = Button(
          self.f1, text='Seat%d' % seat_counter1, 
          name='seat%d' % seat_counter1, bg='#ff0000' 
         ) 
         b1.grid(row=X, column=y) 
         seat_counter1 += 1 
         self.seatCounter(1, 1) 
        else: 
         b1 = Button(
          self.f1, text='Seat%d' % seat_counter1, 
          name='seat%d' % seat_counter1,command= lambda j = seat_counter1: self.SeatClick(j) 
         ) 
         b1.grid(row=X, column=y) 
         self.button_list1[seat_counter1] = b1 
         seat_counter1 += 1 
     elif(frame_pointer == 2): 
      seat_counter2 = 1 
      for x in range(int(col)): 
       X = x + 10 
       for y in range(1, 11): 
        taken_seats = randint(1,3) 
        if(taken_seats == 3): 
         b2 = Button(
          self.f2, text='Seat%d' % seat_counter2, 
          name='seat%d' % seat_counter2, bg='#ff0000' 
         ) 
         b2.grid(row=X, column=y) 
         seat_counter2 += 1 
         self.seatCounter(1, 2) 
        else: 
         b2 = Button(
          self.f2, text='Seat%d' % seat_counter2, 
          name='seat%d' % seat_counter2,command= lambda j = seat_counter2: self.SeatClick(j) 
         ) 
         b2.grid(row=X, column=y) 
         self.button_list2[seat_counter2] = b2 
         seat_counter2 += 1 
     else: 
      seat_counter3 = 1 
      for x in range(int(col)): 
       X = x + 10 
       for y in range(1, 11): 
        taken_seats = randint(1,3) 
        if(taken_seats == 3): 
         b3 = Button(
          self.f3, text='Seat%d' % seat_counter3, 
          name='seat%d' % seat_counter3, bg='#ff0000' 
         ) 
         b3.grid(row=X, column=y) 
         seat_counter3 += 1 
         self.seatCounter(1, 3) 
        else: 
         b3 = Button(
          self.f3, text='Seat%d' % seat_counter3, 
          name='seat%d' % seat_counter3,command= lambda j = seat_counter3: self.SeatClick(j) 
         ) 
         b3.grid(row=X, column=y) 
         self.button_list3[seat_counter3] = b3 
         seat_counter3 += 1 

    def displaySeats(self,show): 
     if(show == 10): 
      self.available_seats1.set(250) 
      self.createSeats(250, 1) 
     elif(show == 3): 
      self.available_seats2.set(150) 
      self.createSeats(150, 2) 
     else: 
      self.available_seats3.set(150) 
      self.createSeats(150, 3) 
     self.resetVal() 

if __name__ == '__main__': 
    root = Tk() 
    w, h = root.winfo_screenwidth(), root.winfo_screenheight() 
    #root.overrideredirect(1) #removes menubar 
    root.focus_set() # <-- move focus to this widget 
    root.geometry("%dx%d+0+0" % (w, h)) 
    root.title("Circus ticketing system") 

    UI_Class = GUI(root) 
    Program_Class = Program() 

    root.mainloop() 

回答

1

Program_Class對象在UI_Class對象實例化後,後者不引用之前。嘗試通過Program_ClassGUI構造:

Program_Class = Program() 
UI_Class = GUI(root, Program_Class) 

其中:

class GUI: 
    def __init__(self, parent, program): 
     self.program = program 

,那麼你應該能夠引用self.program

+0

但是GUI類已經引用了Program類中的一些函數,它們都引用了彼此,我需要同時實例化它們,否則我只是不斷收到錯誤。 –

+0

如果可能的話,移動一些部分以使它們不相互依賴,或者創建第三個包含共享屬性的類並將其傳遞給兩者。這可以通過構造函數完成,也可以在創建後完成,具體取決於Tk的初始化要求。在附註中,引用Program類是可能的,但一般情況下最好調用實例化的'Program_Class'對象。最後,將它命名爲'Program_Class'有點令人困惑,我建議爲實例化的對象使用更多的常規變量名稱,例如'program'或'myProgram'。 –