Уведомления

Группа в Telegram: @pythonsu

#1 Июль 30, 2016 17:11:05

Samscara
Зарегистрирован: 2016-02-14
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите понять код

Привет, ребята!
Изучаю питон по книжке для младенцев Майкла Доусона, все понятно и просто, но не всё:
есть программка, которая принимает пользовательский выбор флажка и в зависимости от этого выводит ту или иную строку. Вот она:

 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()

Сама по себе программка простая, но мне не совсем понятно, зачем здесь присваивается variable, если больше она нигде не используется, может ли мне кто-нибудь это объяснить?
Заранее спасибо!

Офлайн

#2 Июль 30, 2016 18:36:33

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Помогите понять код

Samscara
но мне не совсем понятно, зачем здесь присваивается variable
Делаются переменные и присоединяются к управляющим элементам. Когда происходит взаимодействие с управляющим элементом, то значение как берётся из переменной, так и сохраняется в переменную. Если ты выставил флажок, то его состояние хранится внутри переменной. Если ты снял флажок, то его состояние хранится внутри переменной. А контрол (управляющий элемент) просто читает состояние переменной и отображает.



Отредактировано py.user.next (Июль 30, 2016 18:38:12)

Офлайн

#3 Июль 30, 2016 18:44:01

Samscara
Зарегистрирован: 2016-02-14
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите понять код

py.user.next это понятно, но само по себе variable - это служебное слово, я так понимаю, по крайне мере заменить его на другое без потери функциональности мне не удалось. То есть если я использую экземпляры класса BooleanVar, то мне обязательно использовать именно variable, чтобы все работало?

Офлайн

#4 Июль 30, 2016 20:47:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Помогите понять код

Samscara
но само по себе variable - это служебное слово
Это не служебное слово, а именованный аргумент функции.

  
>>> def f(arg=5, variable=10):
...     print(arg, variable)
... 
>>> f(arg=3)
3 10
>>> 



Отредактировано py.user.next (Июль 30, 2016 20:47:21)

Офлайн

#5 Июль 30, 2016 21:17:45

Samscara
Зарегистрирован: 2016-02-14
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите понять код

py.user.next
ок, но почему оно неизменяемо - мне непонятно, по идее ведь можно аргументам давать любые имена, нет?
или само по себе слово variable как “переменная” несет в себе значение, что его нельзя изменять?
просто очень хочется понять суть

Офлайн

#6 Июль 31, 2016 05:14:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Помогите понять код

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version