2015-03-29 2 views
0

Использования Python 2.7 и Tkinter в Linux Mint «Mate» 17 средыПереходя постоянные значения в класс

я совершенно новый для объектно-ориентированного программирования и не понимаю, как передать постоянные значения в экземпляр класса; в этом коде генерируются «глобальная не определены» ошибка, когда я использую Pin_ID в строках 20 и 22:

1 #!/usr/bin/env python 
2 import Tkinter as tk 
3 
4 root = tk.Tk() 
5 
6 class cbClass: 
7 def __init__(self, Pin_ID): 
8  self.cb_Txt=tk.StringVar() 
9  self.cb_Txt.set("Pin " + Pin_ID + " OFF") 
10  self.cb_Var = tk.IntVar() 
11  cb = tk.Checkbutton(
12  root, 
13  textvariable=self.cb_Txt, 
14  variable=self.cb_Var, 
15  command=self.cbTest) 
16  cb.pack() 
17 
18 def cbTest(self): 
19  if self.cb_Var.get(): 
20  self.cb_Txt.set("Pin " + Pin_ID + " ON") 
21  else: 
22  self.cb_Txt.set("Pin " + Pin_ID + " OFF") 
23 
24 c1 = cbClass("8") 
25 c2 = cbClass("E") 
26 root.mainloop() 
+0

Я думаю, это из-за Pin_ID, вы должны Pin_ID в качестве параметра в '_init_' функции, но не в' cbTest' – bayblade567

ответ

3

Вы хотите сохранить PinID и переменный экземпляр класса. Это в __init__ с

self.PinID = PinID 

и cbTest, вы бы получить доступ с self.PinID, а не просто PinID

+0

Спасибо Томми за такой быстрый и полезный ответ. Интересно, почему вы не можете просто передать значение в определении класса, как в классе cbClass (Pin_ID), и использовать это значение глобально внутри класса? – Andy

+0

это то, что происходит, когда вы добавляете его в 'self', поскольку данные экземпляра объекта и методы поддерживаются в' self' и неявно передаются всем методам класса. Вероятно, вы могли бы достичь глобального определения, используя ключевое слово 'global', но это было бы хакерским и могло бы отрицательно повлиять на другие вещи в пространстве имен. 'self' - это способ, который следует выполнять при сохранении данных, специфичных для экземпляра, в классе – Tommy

0

Спасибо Томми: добавив следующую строку в -init-:

self.Pin_ID = Pin_ID 

и путем использования ссылок в других источниках, например:

self.cb_Txt.set ("Pin " + self.Pin_ID + " ON") 

Мне удалось передать значение.

+0

В вашем исходном сообщении проблема была в области этого имени, она * * существовала * внутри' '' __init__''', блок был . Это решение должно было сделать его атрибутом am экземпляра класса. Вот пара ссылок - [9.2. Области и пространства имен Python] (https://docs.python.org/2.7/tutorial/classes.html#python-scopes-and-namespaces), - [4.1. Именование и привязка] (https://docs.python.org/2.7/reference/executionmodel.html#naming-and-binding). – wwii

5

Если вы хотите запомнить значение аргумента конструктора, вам нужно сохранить его как атрибут экземпляра класса, используя self, как уже упоминалось. Более принципиально, что нужно улучшить, это дизайн кнопки GUI и связанное с этим использование модуля Tkinter.

Вот пример более типичного способа достижения того, что, как я думаю, вы пытаетесь сделать. Он изменяет GUI, удаляя избыточность состояния CheckButton, представленного как ли он отмечен , так и, что отображается в качестве его метки (т. Е. Если оно отмечено, оно включено).

import Tkinter as tk 

root = tk.Tk() 

class cbClass: 
    def __init__(self, PinID): 
     self.PinID = "Pin " + PinID 
     self.cbTxt = tk.StringVar() 
     self.cbTxt.set(self.PinID) 
     self.cb = tk.Checkbutton(root, 
           text=self.PinID, 
           variable=self.cbTxt, 
           onvalue="ON", offvalue="OFF", 
           command=self.cbTest) 
     self.cb.pack() 

    def cbTest(self): 
     """ Called when checkbutton state is changed. """ 
     print("{} variable is now {}".format(self.PinID, self.cbTxt.get())) 

c1 = cbClass("8") 
c2 = cbClass("E") 
root.mainloop() 
Смежные вопросы