Найти - Пользователи
Полная версия: перерисовывание главного окна после исполнения функции (tkinter)
Начало » GUI » перерисовывание главного окна после исполнения функции (tkinter)
1
caufman
Пытаюсь выполнить следующее задание: “Создайте приложение, в котором меняется размер фрейма в зависимости от того, какая из трех объектов-кнопок была нажата.”
Код написал, но фрэйм не меняет размеров после нажатия кнопки. Я так понял, функции выполняются, но фрейм в главном окне не перерисовывается. Как это сделать?
# практическая задача по уроку bind
from Tkinter import *
f = [25, 25]
def df150x25(event):
    f[0], f[1] = 150, 25
def df70x250(event):
    f[0], f[1] = 70, 250
def df200x40(event):
    f[0], f[1] = 200, 40
root = Tk()
fra = Frame(root, width=f[0], height=f[1], bg='red')
but150x25 = Button(root, text=u'150 x 25', font='Tahoma 8')
but70x250 = Button(root, text=u'70 x 250', font='Tahoma 8')
but200x40 = Button(root, text=u'200 x 40', font='Tahoma 8')
fra.grid(row=0, column=0)
but150x25.grid(row=1, column=0)
but70x250.grid(row=2, column=0)
but200x40.grid(row=3, column=0)
fra.pack()
but150x25.pack()
but70x250.pack()
but200x40.pack()
but150x25.bind('<Button-1>', df150x25)
but70x250.bind('<Button-1>', df70x250)
but200x40.bind('<Button-1>', df200x40)
root.mainloop()
4kpt
Во-первых:
Перенести тему в раздел GUI (где она собственно и должна быть :)…
Во-вторых:
Получить от меня ответ на поставленный вопрос.
В-третьих:
Разобраться с полученным ответом и запомнить для себя результат :)
caufman
По моему, здесь слишком базовый момент расматривается. Думаю подобная проблема возможна в основном у новичков.
4kpt
Эта тема относится к GUI. Все, кого интересуют базовые моменты, касающиеся GUI - пишут вопросы там.
Я Вас не подкалываю. Просто, возможно, если у другого новичка возникнет такой же вопрос, он будет искать ответ в разделе GUI. Поверьте мне. Уже сталкивался. :)

P.S. Тему можно просто продублировать, а тут указать перенос :)
Griffon
Изменение значений в списке не меняет свойств обьектов:
x = [1,2]
y = x[0]
x[0] = 5
print y

from Tkinter import *
root = Tk()
fra = Frame(root, width=25, height=25, bg='red')
but150x25 = Button(root, text=u'150 x 25', font='Tahoma 8', command=lambda:fra.config(width=150, height=25))
but70x250 = Button(root, text=u'70 x 250', font='Tahoma 8', command=lambda:fra.config(width=70, height=250))
but200x40 = Button(root, text=u'200 x 40', font='Tahoma 8', command=lambda:fra.config(width=200, height=40))
fra.pack()
but150x25.pack()
but70x250.pack()
but200x40.pack()
root.mainloop()
caufman
Griffon
Изменение значений в списке не меняет свойств обьектов:
У меня практическая задача по уроку bind, то есть задачу нужно решить с помощью данного метода. А в вашем примере данный метод отсутствует. Да и что такое лямда - по материалу еще нет. Здесь должна использоваться функция на событие и метод бинд - условия задачи.

Хотя ваш пример я обязательно изучу, раз так получается намного короче и проще.
4kpt
Griffon Абсолютно прав. Технология поиска связанных данных в tkinter отсутствует, посему можно только так…
# практическая задача по уроку bind
from Tkinter import *
f = [25, 25]
def df150x25(event):
    fra.config(width=150, height=25)
def df70x250(event):
    fra.config(width=70, height=250)
def df200x40(event):
    fra.config(width=200, height=400)
root = Tk()
root.geometry("600x600+100+100")
fra = Frame(root, width=f[0], height=f[1], bg='red')
but150x25 = Button(root, text=u'150 x 25', font='Tahoma 8')
but70x250 = Button(root, text=u'70 x 250', font='Tahoma 8')
but200x40 = Button(root, text=u'200 x 40', font='Tahoma 8')
fra.grid(row=0, column=0)
but150x25.grid(row=1, column=0)
but70x250.grid(row=2, column=0)
but200x40.grid(row=3, column=0)
fra.pack()
but150x25.pack()
but70x250.pack()
but200x40.pack()
but150x25.bind('<Button-1>', df150x25)
but70x250.bind('<Button-1>', df70x250)
but200x40.bind('<Button-1>', df200x40)
root.mainloop()

P.S. Ламбда - это выражение (ее еще называют анонимной функцией) которое, в отличии от инструкции def возвращает функцию а не связывает ее с именем. В методе bind она позволяет передавать на функцию дополнительные параметры. Если ее не использовать на функцию будет передаваться только event (т.е. событие). На самом деле это событие несет в себе тоже немало полезных няшек, но…

Пример:
def call(event, data):
    print data
bt.bind("<Button-1>", call(data))

В этом случае методу bind присваивается не объект функции (как ожидается), а результат ее выполнения - что в корне неверно. На помощь приходит анонимная функция lambda. Мы знаем, что что метод bind передает на функцию вызова первый аргумент-событие (зачастую его называют event). Этими знаниями мы и воспользуемся, переписав вызов, чтобы на функцию передавалось другое, нам нужное, значение.

def call(event, data):
    print data
bt.bind("<Button-1>", lambda event: call(event, data))
Теперь в метод bind передается функция, так как lambda возвращает именно функцию, которая в свою очередь сама передаст данные в функцию call.

Что-то я сегодня в ударе :)
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