Найти - Пользователи
Полная версия: Tkinter->class->bind
Начало » Python для новичков » Tkinter->class->bind
1
Cergei
Здравствуйте.Учусь писать на питоне,до этого был опыт на языке Си под микроконтроллеры и работа в Linux системах.
Задача написать несколько таймеров в графической оболочке tkinter в стиле ООП.
Проблема встала в обработке нажатия кнопки
self.button.bind('<Button-1>',start)
в функции __init__ класса Kabinka.Экземпляров класса Kabinka 10 штук и отдельно обработку 10 кнопок не очень охото.Потом пропадает стиль ООП.
Функция обработки кнопки описана ниже,но не видит и выдает ошибку:
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()
py.user.next
Cergei
NameError: name 'start' is not defined
self.start
4kpt_III
1. ООП в Tkinter не совсем делается так
2. Не надо делать from tkinter import *
3. Такие вопросы лучше писать в ветке GUI.
Cergei
4kpt_III
1. ООП в Tkinter не совсем делается так 2. Не надо делать from tkinter import *3. Такие вопросы лучше писать в ветке GUI.

Не сразу знал куда писать тему,если сможет модератор пусть перенесет тему.
Можно пример как делается ООП в Tkinter ?
Спасибо за подсказку py.user.next
4kpt_III
Поройтесь в темах в разделе GUI. Я писал неоднократно.
Основная идея состоит в том, чтобы наследовать класс от одного из базовых виджетов. Чаще всего это или toplevel или frame. После этого получается новый виджет (созданный Вами класс) который можно размещать где угодно и как угодно. Если в классе будут описаны методы - тогда Вы сможете управлять поведением виджета извне. Если атрибуты - состоянием (внешним видом, размещением элементов виджета - других виджетов и т.п.).

P.S. И про
if __name__ == “__main__”: не забываем.
Cergei
Не спец в классах.Дойдет позже выгодность наследования наверно.
Как можно написать в наследуемом классе свою функцию,только если стандартные комманды python и команды tkinter.Атрибуты согласен для своего окна или frame выгодно сделать конечно.
Был небольшой опыт изучения С++ с классами,но до программного обеспечения так руки и не дошли.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB