Найти - Пользователи
Полная версия: смена свойств кнопки после клика
Начало » GUI » смена свойств кнопки после клика
1
zlodiak
и снова извиняюсь за многокодие, но упростить проблему не получается

import tkinter
import tkinter.messagebox
import random
from PIL import Image
class Application(tkinter.Frame):
    
    def __init__(self, parent=None):
        tkinter.Frame.__init__(self, parent)
        self.config(width=700, height=500)
        self.pack_propagate(False)
        self.slides = {
            'blue': 'active',
            'red': 'active',
            'green': 'active',
            'orange': 'active',
            'navy': 'active'
        }
        self.icons = ['error', 'question', 'hourglass', 'info', 'warning', 'gray50', 'questhead']
        self.make_widgets()
        self.pack()
        self.period = 1000
    def make_widgets(self):
        self.buttonState = tkinter.Button(self, text='Start', command=self.on_start)
        self.buttonState.pack()
        self.periodScale = tkinter.Scale(   self,
                                            label='Time period',
                                            orient='horizontal',
                                            from_=1,
                                            to=5
                                    )
        self.periodScale.pack()
        self.buttonsArea = tkinter.Frame(self, pady=30)
        self.buttonsArea.pack()
        
        for (i, color) in enumerate(self.slides.keys()):
            item = tkinter.Button( self.buttonsArea,
                            text=color,
                            width=90,
                            height=90,
                            relief='sunken',
                            borderwidth=5,
                            bg=color
                        )
            item.bind('<Button-1>', lambda event, i=i, color=color: self.invert_value(event, i, color))
            #original = Image.open('images/img1.gif')
            #ph_im = Image.PhotoImage(original)
            item.config(bitmap=random.choice(self.icons))
            item.pack(side='left')
        self.svetofor = tkinter.Canvas(self, bg='red', width=300, height=200)
        self.svetofor.pack()
    def on_start(self):
        self.loop = True
        self.buttonState.config(text='Stop', command=self.on_stop)
        self.on_timer()
    def on_stop(self):
        self.loop = False
        self.buttonState.config(text='Start', command=self.on_start)
    def on_timer(self):
        if self.loop:
            li = []
            li[:] = [c for c,s in self.slides.items() if s == 'active']
            if len(li) == 0:
                try:
                    self.on_stop()
                except NameError:
                    tkinter.messagebox.showerror('Error', 'Function call error')
                except Exception:
                    tkinter.messagebox.showerror('Error', 'System error')
                except:
                    print('ээээх петруха')
                else:
                    tkinter.messagebox.showinfo('Info', 'Forced stop')
                finally:
                    self.after(self.periodScale.get() * 1000, self.on_timer)
            else:             
                self.svetofor.config(bg=random.choice(li))
                self.after(self.periodScale.get() * 1000, self.on_timer)
    def invert_value(self, event, i, color):
        #self.slides[color] = 'active' if self.slides[color] == 'unactive' else 'unactive'
        if self.slides[color] == 'active':
            self.slides[color] = 'unactive'
            event.widget['relief'] = 'raised'
        elif self.slides[color] == 'unactive':
            self.slides[color] = 'active'
            event.widget['relief'] = 'sunken'
        print(self.slides)
        
if __name__ == '__main__':
    root = tkinter.Tk()
    root.title('svetofor')
    root.geometry('700x500')
    Application(root)
    root.mainloop()

в этом скрипте после клика на кнопках должно попеременно меняться свойство relief. но этого не происходит. то есть например бывает так, что я кликаю по кнопке, имеющей состояние relief='sunken', а она не становится ‘raised’. только после нескольких кликов она меняет состояние. всё это происходит на win 7 64

помогите пожалуйста исправить и понять(и по-возможности простить так сказать) явление
4kpt_II
Программа себя абсолютно правильно ведет…
Измените виджет. Кнопка Вам тут не нужна. Лучше используйте несколько Canvas. С ним таких проблем быть не должно.

P.S. И зачем Вы все еще продолжаете насиловать бедную лямбду Я же Вам написал, как это обойти.

Будут вопросы - пишите…
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