Форум сайта python.su
0
Здравствуйте.Учусь писать на питоне,до этого был опыт на языке Си под микроконтроллеры и работа в Linux системах.
Задача написать несколько таймеров в графической оболочке tkinter в стиле ООП.
Проблема встала в обработке нажатия кнопки
self.button.bind('<Button-1>',start)
Traceback (most recent call last): File "D:\Python34\fizio.py", line 59, in <module> Kab1=Kabinka("Кабинка №1: ") File "D:\Python34\fizio.py", line 25, in __init__ self.button.bind('<Button-1>',start) NameError: name 'start' is not defined
from tkinter import * import time class Kabinka: def __init__(self,text_kab): self.frame=Frame(root,width=200,heigh=200,bg='green',bd=5) self.frame.pack() self.label=Label(self.frame,font="sans 20",bg="black",fg="red") self.label['text']=text_kab self.label.pack(side='left') self.button=Button(self.frame,text="Пуск/Стоп") self.button.pack(side='right') self.v=StringVar() self.ent1=Entry(self.frame,textvariable = self.v,bg="white",fg="black",width=4,bd=7) self.ent1.pack(side="top") self.v.set("0") self.s = self.v.get() self.number=int(self.s) self.label['text']=text_kab+'Остановлена' self.button.bind('<Button-1>',start) self.start__='off' self.current=0 def start(self,event): if self.start__=="off": self.start__="on" self.current=time.clock def window_deleted(): #print('Окно закрыто') root.destroy() # явное указание на выход из программы def tick(): label_clock.after(200, tick) label_clock['text'] = time.strftime('%H:%M:%S') root=Tk() root.title('Кабинет ФизиоТерапии') root.geometry('1000x600') # ширина=500, высота=400, x=300, y=200 root.protocol('WM_DELETE_WINDOW', window_deleted) # обработчик закрытия окна label_clock = Label(font='sans 100',bg='black',fg='yellow') label_clock.after_idle(tick) #root.grab_set #root.resizable(True, False) # размер окна может быть изменен только по горизонтали label_clock.pack(fill="both") Kab1=Kabinka("Кабинка №1: ") Kab2=Kabinka("Кабинка №2: ") Kab3=Kabinka("Кабинка №3: ") Kab4=Kabinka("Кабинка №4: ") Kab5=Kabinka("Кабинка №5: ") Kab6=Kabinka("Кабинка №6: ") Kab7=Kabinka("Кабинка №7: ") Kab8=Kabinka("Кабинка №8: ") Kab9=Kabinka("Кабинка №9: ") Kab10=Kabinka("Кабинка №10: ") root.mainloop()
Офлайн
857
Cergeiself.startNameError: name 'start' is not defined
Офлайн
39
1. ООП в Tkinter не совсем делается так 
2. Не надо делать from tkinter import *
3. Такие вопросы лучше писать в ветке GUI.
Офлайн
0
4kpt_III
1. ООП в Tkinter не совсем делается так 2. Не надо делать from tkinter import *3. Такие вопросы лучше писать в ветке GUI.
Офлайн
39
Поройтесь в темах в разделе GUI. Я писал неоднократно.
Основная идея состоит в том, чтобы наследовать класс от одного из базовых виджетов. Чаще всего это или toplevel или frame. После этого получается новый виджет (созданный Вами класс) который можно размещать где угодно и как угодно. Если в классе будут описаны методы - тогда Вы сможете управлять поведением виджета извне. Если атрибуты - состоянием (внешним видом, размещением элементов виджета - других виджетов и т.п.).
P.S. И про
if __name__ == “__main__”: не забываем.
Отредактировано 4kpt_III (Июнь 3, 2015 03:35:34)
Офлайн
0
Не спец в классах.Дойдет позже выгодность наследования наверно.
Как можно написать в наследуемом классе свою функцию,только если стандартные комманды python и команды tkinter.Атрибуты согласен для своего окна или frame выгодно сделать конечно.
Был небольшой опыт изучения С++ с классами,но до программного обеспечения так руки и не дошли.
Офлайн