Форум сайта python.su
0
Привет, ребята!
Изучаю питон по книжке для младенцев Майкла Доусона, все понятно и просто, но не всё:
есть программка, которая принимает пользовательский выбор флажка и в зависимости от этого выводит ту или иную строку. Вот она:
from tkinter import * class Application(Frame): """ GUI Application for favorite movie types. """ def __init__(self, master): super(Application, self).__init__(master) self.grid() self.create_widgets() def create_widgets(self): """ Create widgets for movie type choices. """ # create description label Label(self, text = "Choose your favorite movie types" ).grid(row = 0, column = 0, sticky = W) # create instruction label Label(self, text = "Select all that apply:" ).grid(row = 1, column = 0, sticky = W) # create Comedy check button self.likes_comedy = BooleanVar() Checkbutton(self, text = "Comedy", variable = self.likes_comedy, command = self.update_text ).grid(row = 2, column = 0, sticky = W) # create Drama check button self.likes_drama = BooleanVar() Checkbutton(self, text = "Drama", variable = self.likes_drama, command = self.update_text ).grid(row = 3, column = 0, sticky = W) # create Romance check button self.likes_romance = BooleanVar() Checkbutton(self, text = "Romance", variable = self.likes_romance, command = self.update_text ).grid(row = 4, column = 0, sticky = W) # create text field to display results self.results_txt = Text(self, width = 40, height = 5, wrap = WORD) self.results_txt.grid(row = 5, column = 0, columnspan = 3) def update_text(self): """ Update text widget and display user's favorite movie types. """ likes = "" if self.likes_comedy.get(): likes += "You like comedic movies.\n" if self.likes_drama.get(): likes += "You like dramatic movies.\n" if self.likes_romance.get(): likes += "You like romantic movies." self.results_txt.delete(0.0, END) self.results_txt.insert(0.0, likes) # main root = Tk() root.title("Movie Chooser") app = Application(root) root.mainloop()
Офлайн
857
SamscaraДелаются переменные и присоединяются к управляющим элементам. Когда происходит взаимодействие с управляющим элементом, то значение как берётся из переменной, так и сохраняется в переменную. Если ты выставил флажок, то его состояние хранится внутри переменной. Если ты снял флажок, то его состояние хранится внутри переменной. А контрол (управляющий элемент) просто читает состояние переменной и отображает.
но мне не совсем понятно, зачем здесь присваивается variable
Отредактировано py.user.next (Июль 30, 2016 18:38:12)
Офлайн
0
py.user.next это понятно, но само по себе variable - это служебное слово, я так понимаю, по крайне мере заменить его на другое без потери функциональности мне не удалось. То есть если я использую экземпляры класса BooleanVar, то мне обязательно использовать именно variable, чтобы все работало?
Офлайн
857
SamscaraЭто не служебное слово, а именованный аргумент функции.
но само по себе variable - это служебное слово
>>> def f(arg=5, variable=10): ... print(arg, variable) ... >>> f(arg=3) 3 10 >>>
Отредактировано py.user.next (Июль 30, 2016 20:47:21)
Офлайн
0
py.user.next
ок, но почему оно неизменяемо - мне непонятно, по идее ведь можно аргументам давать любые имена, нет?
или само по себе слово variable как “переменная” несет в себе значение, что его нельзя изменять?
просто очень хочется понять суть
Офлайн
857
SamscaraИменнованному аргументу ты не можешь дать другое имя. Другим способом его можно только позиционно указать.
ок, но почему оно неизменяемо - мне непонятно, по идее ведь можно аргументам давать любые имена, нет?
>>> def f(arg=5, variable=10): ... print(arg, variable) ... >>> f() 5 10 >>> f(arg=3, variable=4) 3 4 >>> f(3, 4) 3 4 >>> f(variable=4, arg=3) 3 4 >>> f(arg=3, v=4) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: f() got an unexpected keyword argument 'v' >>>
Отредактировано py.user.next (Июль 31, 2016 05:15:27)
Офлайн