2013-09-02 2 views
0

다음 코드에서는 'Daily Order Object'에 'register'속성이 없습니다. 왜 이것이 도움이 될지 전혀 모르겠다 - 기꺼이 받아 들여지는 도움.self.register 속성 오류 제공

항목 위젯의 유효성을 검사하려고하는데 범용 메서드 인 .register()가 항목 위젯에 정수가 있는지 확인하는 "is_valid_int()"함수를 등록해야한다고 생각했던 것을 사용하려고합니다.

from tkinter import * 
from tkinter.scrolledtext import * 

class DailyOrderGUI: 
    def __init__(self, parent): 
     #Data entring frame 
     self.frame = Frame(parent, bg = "grey") 
     self.frame.grid(row=0) 
     self.label1 = Label(self.frame, text = "Mrs CackleBerry's Egg Ordering System", bg="grey", font=("Comic Sans MS", "14", "bold")) 
     self.label1.grid(row = 0, columnspan = 4, padx = 5, pady = 5) 
     self.v = StringVar() 
     self.v.set("Monday") 
     self.label2 = Label(self.frame, text = "Which day are you ordering for?", bg="grey", font=("Arial", "12", "bold")) 
     self.label2.grid(row = 1, columnspan = 4, sticky = W) 
     self.rb1 = Radiobutton(self.frame, variable = self.v, bg="grey", value = "Monday", text = "Monday") 
     self.rb1.grid(row = 2, column = 0, sticky = W) 
     self.rb2 = Radiobutton(self.frame, variable = self.v, bg="grey", value = "Tuesday", text = "Tuesday") 
     self.rb2.grid(row = 2, column = 1, sticky = W) 
     self.rb3 = Radiobutton(self.frame, variable = self.v, bg="grey", value = "Wednesday", text = "Wednesday") 
     self.rb3.grid(row = 2, column = 2, sticky = W) 
     self.rb4 = Radiobutton(self.frame, variable = self.v, bg="grey", value = "Thursday", text = "Thursday") 
     self.rb4.grid(row = 2, column = 3, sticky = W) 
     self.rb5 = Radiobutton(self.frame, variable = self.v, bg="grey", value = "Friday", text = "Friday") 
     self.rb5.grid(row = 3, column = 0, sticky = W) 
     self.rb6 = Radiobutton(self.frame, variable = self.v, bg="grey", value = "Saturday", text = "Saturday") 
     self.rb6.grid(row = 3, column = 1, sticky = W) 
     self.rb7 = Radiobutton(self.frame, variable = self.v, bg="grey", value = "Sunday", text = "Sunday") 
     self.rb7.grid(row = 3, column = 2, sticky = W) 
     self.label3 = Label(self.frame, text = "Customer's Name:?(Press \"Orders Complete\" to finish)", bg="grey", font=("Arial", "12", "bold")) 
     self.label3.grid(row = 4, columnspan = 4,padx = 5,sticky = W) 
     self.e1 = Entry(self.frame, width = 30) 
     self.e1.grid(row = 5, columnspan = 4, sticky = W, padx = 5, pady=3) 
     self.e1.focus() 
     self.label4 = Label(self.frame, text = "How many eggs being ordered:?", bg="grey", font=("Arial", "12", "bold")) 
     self.label4.grid(row = 6, columnspan = 4,padx = 5,sticky = W) 
     vcmd = (self.register(self.is_valid_int),"%P") 
     self.e2 = Entry(self.frame, width = 10, validate='all', validatecommand=vcmd) 
     self.e2.grid(row = 7, columnspan = 4, sticky = W, padx = 5, pady=3) 
     self.e2.bind("<Return>", self.get_orders) 

     self.btn1 = Button(self.frame, text = "Submit") 
     self.btn1.grid(row = 8, padx = 5, sticky = E+W) 
     self.btn1.bind("<Button-1>", self.get_orders) 
     self.btn2 = Button(self.frame, text = "Orders Complete", command = self.show_summary_result) 
     self.btn2.grid(row = 8, column = 3, padx = 5, sticky = E+W) 

     #Summary Frame 
     self.summ_frame = Frame(parent, bg = "grey") 
     self.summ_frame.grid(row=0) 
     self.summ_label1 = Label(self.summ_frame, text = "Mrs CackleBerry's Egg Ordering System", bg="grey", font=("Comic Sans MS", "14", "bold")) 
     self.summ_label1.grid(row = 0, columnspan = 4, padx = 5, pady = 5) 
     self.scrolled_display = ScrolledText(self.summ_frame, width = 50, height = 10, bg="thistle", font=("Times New Roman", "12")) 
     self.scrolled_display.grid(row = 1, columnspan = 2, padx = 5, pady = 20, sticky = W) 
     self.data_entry_btn = Button(self.summ_frame, text = "Back to Data Entry", command = self.show_data_entry_frame) 
     self.data_entry_btn.grid(row = 2, column = 0, sticky = SE, padx = 5, pady = 20) 

     self.egg_orders=[] 

     self.show_data_entry_frame() 

    def is_valid_int(self, txt): 
     # txt - value in %P 

     if not txt:   # accept empty string 
      return True 

     try: 
      int(txt) 
      return True  # accept integer 

     except ValueError: # not an integer 
      return False 

    def invalid_int(self, widgetName): 
      # called automatically when the 
      # validation command returns 'False' 

      # get entry widget 
      widget = self.nametowidget(widgetName) 

      # clear entry 
      widget.delete(0, END) 

      # return focus to integer entry 
      widget.focus_set() 
      widget.bell() 

    def show_data_entry_frame(self): 
     self.summ_frame.grid_remove() 
     self.frame.grid() 
     root.update_idletasks() 

    def show_summary_result(self): 
     self.frame.grid_remove() 
     self.summ_frame.grid() 
     root.update_idletasks() 
     self.scrolled_display.delete('1.0', END) 
     if len(self.egg_orders) == 0: 
      self.scrolled_display.insert(END, "No Orders") 
     else: 
      total = 0 
      self.scrolled_display.insert(END, "Orders for " + self.v.get() + "\n") 
      for i in range(len(self.egg_orders)): 
       total += self.egg_orders[i].num_eggs 
       self.scrolled_display.insert(END, str(self.egg_orders[i]) + "\n") 
      self.scrolled_display.insert(END, "" + "\n") 
      self.scrolled_display.insert(END, "Summary for " + self.v.get() + "\n") 
      self.scrolled_display.insert(END, "" + "\n") 
      self.scrolled_display.insert(END, "Total eggs: " + str(total) + "\n") 
      self.scrolled_display.insert(END, "Dozens required: " + str(self.get_dozens(total)) + "\n") 
      average = 0 
      if len(self.egg_orders) > 0: 
       average = total/len(self.egg_orders) 
      self.scrolled_display.insert(END, "Average number of eggs per customer: {0:.1f}".format(average) + "\n") 

    def get_orders(self, event): 
     """ 
     Collects order information - name, number of eggs in a loop 
     """ 
     self.name = self.e1.get() 
     self.no_eggs = self.e2.get() 
     self.e1.delete(0, END) 
     self.e2.delete(0, END) 
     self.e1.focus() 
     self.egg_orders.append(EggOrder(self.name, self.no_eggs)) 

    def get_dozens (self, total): 
     """ 
     returns whole number of dozens required to meet required number of eggs 
     """ 
     num_dozens = total//12 
     if total%12 != 0: 
      num_dozens += 1 
     return num_dozens 

class EggOrder: 

    price_per_doz = 6.5 
    def __init__(self, name, num_eggs): 
     self.name = name 
     self.num_eggs = int(num_eggs) 


    def calc_price(self): 
     self.price = EggOrder.price_per_doz/12 * self.num_eggs 
     return self.price 

    def __str__(self): 
     return("{} ordered {} eggs. The price is ${:.2f}".format(self.name, self.num_eggs , self.calc_price())) 



#main routine 
if __name__== "__main__": 
    root = Tk() 
    root.title("Mrs Cackleberry's Egg Ordering Program") 
    frames = DailyOrderGUI(root) 
    root.mainloop() 

답변

1

클래스 DailyOrderGUI : 메소드 레지스터를 구현하거나 상속하지 않습니다.

다른 위젯에서 양식을 상속 받아야합니다.

+0

나는 tkinter 또는 python에 등록 메소드가 내장되어 있다고 생각했습니다. 그렇지 않은가요? –

+0

답을 찾았습니다. validate 명령을 호출 할 자식 수준에 등록해야합니다. ievcmd = (self.register (self.is_valid_int), "% P")는 vcmd = (self.frame.register (self. is_valid_int), "% P") –

+0

예, 'register'는 파이썬의 기본 '객체'에 내장되어 있지 않습니다. 이 경우이 라이브러리는 tkinter 라이브러리의 일부이므로 tkinter 객체에서 상속하거나 사용해야합니다. –