2017-01-26 8 views
0

все.Как обновить глобальную целочисленную переменную локально?

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

Вот код, который я написал ...

from tkinter import * 
from tkinter import ttk 
from PIL import Image, ImageTk 

class Application(Frame): 
    def __init__(self, master): 
     ttk.Frame.__init__(self, master) 

     self.grid() 
     self.create_widgets() 
     self.FIDSIA_Amount() 

    def create_widgets(self): 
     self.label1 = Label(self, text='Type').grid(row=1, column=12, sticky=E) 

     self.Type = ttk.Combobox(self, width=7, textvariable=varSymbol, state="readonly") 
     self.Type['values'] = ('--------', 'A','B','C') 
     self.Type.grid(row=1, column=13) 
     self.Type.bind("<<ComboboxSelected>>", self.adjustmentFIDSIA_Planet1) 

    def adjustmentFIDSIA_Planet1(self, event): 
     content = self.Type.get() 

     if content == 'A': 
      varP1f = 0 
      varP1ind = 12 
      varP1d = 1 
      varP1s = 0 
      varP1inf = 0 
      varP1app = -15 
     elif content == 'B': 
      varP1f = 0 
      varP1ind = 12 
      varP1d = 1 
      varP1s = 0 
      varP1inf = 0 
      varP1app = -10 
     elif content == 'C': 
      varP1f = 0 
      varP1ind = 12 
      varP1d = 1 
      varP1s = 0 
      varP1inf = 0 
      varP1app = -5 
     elif content == '--------': 
      varP1f = 0 
      varP1ind = 0 
      varP1d = 0 
      varP1s = 0 
      varP1inf = 0 
      varP1app = 0 

    def FIDSIA_Amount(self): 
     amountf = Label(self, textvariable=varP1F) 
     amountf.grid(row=1, column=1) 
     amountind = Label(self, textvariable=varP1Ind) 
     amountind.grid(row=1, column=3) 
     amountd = Label(self, textvariable=varP1D) 
     amountd.grid(row=1, column=5) 
     amounts = Label(self, textvariable=varP1S) 
     amounts.grid(row=1, column=7) 
     amountinf = Label(self, textvariable=varP1Inf) 
     amountinf.grid(row=1, column=9) 
     amountapp = Label(self, textvariable=varP1App) 
     amountapp.grid(row=1, column=11) 

root = Tk() 

varP1f = IntVar(root) 
varP1ind = IntVar(root) 
varP1d = IntVar(root) 
varP1s = IntVar(root) 
varP1inf = IntVar(root) 
varP1app = IntVar(root) 

varSymbol = StringVar(root, value='--------') 
varP1F = StringVar(root) 
varP1F.set(str(0+varP1f.get())) 
varP1Ind = StringVar(root) 
varP1Ind.set(str(0+varP1ind.get())) 
varP1D = StringVar(root) 
varP1D.set(str(0+varP1d.get())) 
varP1S = StringVar(root) 
varP1S.set(str(0+varP1s.get())) 
varP1Inf = StringVar(root) 
varP1Inf.set(str(0+varP1inf.get())) 
varP1App = StringVar(root) 
varP1App.set(str(0+varP1app.get())) 

app = Application(root) 

root.mainloop() 

Так, в принципе, я создал окно с 6 цифр в нем и рядом с ним, есть выпадающий выпадающий список меню 4 пункта (- ------, A, B, C). То, что я хочу сделать, - это когда -------- выбран в combobox, я хочу, чтобы 6 цифр были равными 0. Однако, если я выберу A в combobox, я хочу, чтобы 6 цифр были обновлены в окне, добавив каждая из 6 переменных на 0. Поэтому, когда я выбираю A, он будет выглядеть как «0 12 1 0 0 -15» вместо «0 0 0 0 0 0». С текущим кодом я не могу это сделать. PyCharm показывает 6 переменных: varP1f и т. Д. ... ошибка -> значение локальной переменной не используется.

Как исправить эту проблему? не

+0

всегда ставится под вопрос полное сообщение об ошибке - есть другая полезная информация. – furas

+0

Вы имели в виду 'self.varP1f'? – Natecat

+0

@ juanpa.arrivillaga - Этот дубликат часто применим, но в этом случае это не так, поскольку это объекты IntVar, которые должны быть мутированы, а не целые числа, которые нужно переназначить. – TigerhawkT3

ответ

1

Как вы используете tkinter.IntVar объекты, вы должны установить их с их методом set, а не переназначение, как что-то вроде x = tkinter.IntVar(); x = 3 сделает что x регулярное целое число и больше в IntVar нет.

Заменить все линии, как это:

if content == 'A': 
    varP1f = 0 
    varP1ind = 12 
    varP1d = 1 

С этим:

if content == 'A': 
    varP1f.set(0) 
    varP1ind.set(12) 
    varP1d.set(1) 
+0

Благодарим за отзыв. Я буду помнить, чтобы переменные были более наглядными и уникальными. Кроме того, я пробовал ваше решение, но когда я выбираю A из combobox, Shell выдает мне эту ошибку «UnboundLocalError: локальная переменная« varP1ind », на которую ссылаются перед назначением». –

+0

@JasonM в функции вы должны использовать 'global varP1f' и т. Д., Чтобы сообщить функции, что вы хотите использовать внешние/глобальные переменные. Или поместите все эти переменные внутри класса с 'self.', и вы всегда с' self.' BTW: вы можете использовать 'IntVar' также с' Label', поэтому вам не нужно 'StringVar'. – furas

+0

@furas - Я немного перестроился с включенным решением TigerhawkT3, и я, наконец, сделал это. Кроме того, я буду замечать ваш комментарий. –