Tkinter: изменение переменной внутри функции - PullRequest
1 голос
/ 30 мая 2009

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

Я хочу иметь возможность сделать что-то вроде:

spam = StringVar()
spam.set(aValue)
class MyScale(Scale):
    def __init__(self,var,*args,**kwargs):
        Scale.__init__(self,*args,**kwargs)
        self.bind("<ButtonRelease-1>",self.getValue)
        self.set(var.get())
    def getValue(self,event):
        ## spam gets changed to the new value set 
        ## by the user manipulating the scale
        var.set(self.get)
eggs = MyScale(spam,*args,**kwargs)
eggs.pack()

Конечно, я получаю обратно "NameError: глобальное имя 'var' не определено."

Как мне обойти невозможность передачи аргументов в getValue? Я предупрежден против использования глобальных переменных, но это единственный вариант? Это настройка отдельного класса шкалы для каждой переменной, которую я хочу изменить? У меня такое чувство, что мне не хватает чего-то, что прямо у меня под носом ...

редактирование: это то, что вы имеете в виду?

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "C:\...\interface.py", line 70, in getValue
    var.set(self.get)
NameError: global name 'var' is not defined

Извините, я программировал только месяц, и часть жаргона все еще ускользает от меня.

Ответы [ 2 ]

2 голосов
/ 30 мая 2009

Пожалуйста, сделайте это.

Во многих примерах кода щедро используются глобальные переменные, например, ваша переменная "var".

Я использовал ваш аргумент var, чтобы действовать как указатель на исходный объект спама; присваивается self.var_pointer в классе MyScale.

Приведенный ниже код изменит значение «спам» (и «яйца») в ButtonRelease весов.

Вы можете проверить значение, набрав eggs.get () или spam.get (), чтобы увидеть измененное значение.

from Tkinter import *
root = Tk()

aValue = "5"
spam = StringVar()
spam.set(aValue)

class MyScale(Scale):
    def __init__(self,var,*args,**kwargs):
        self.var_pointer = var
        Scale.__init__(self,*args,**kwargs)
        self.bind("<ButtonRelease-1>",self.getValue)
        self.set(var.get())
    def getValue(self,event):
        ## spam gets changed to the new value set 
        ## by the user manipulating the scale
        self.var_pointer.set(self.get())

eggs = MyScale(spam)
eggs.pack(anchor=CENTER)
1 голос
/ 30 мая 2009

Давайте посмотрим на этот метод функции

    def getValue(self,event):
        ## spam gets changed to the new value set 
        ## by the user manipulating the scale
        var.set(self.get)

В строке var.set(self.get) есть ровно две локальные переменные:

  • self
  • event

Переменная var не является локальной для этой функции метода. Возможно, он использовался в другом месте в классе или сценарии, но здесь он не локальный.

Возможно, это может быть глобальным, но это плохая практика.

Я не уверен, почему вы думаете, что переменная var будет известна в этом контексте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...