2017-01-26 9 views
0

皆さん。グローバル整数変数をローカルに更新するにはどうすればよいですか?

まず、質問が正しく賞賛されたかどうかはわかりませんが、できる限り努力しました。また、私が使いたい単純なコンピュータプログラムを作成したいので、Pythonを学び始めたばかりです。私は賛成しやすいと思われるかもしれない問題に遭遇したのでここで質問したかったが、解決策を見つけ出すことができない。

ここ

は4つの項目をリストコンボボックスのドロップダウンメニューが(存在し、

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つの数字でウィンドウを作成し、その隣に...私が書いたコードです - ------、A、B、C)。私がしたいのは、コンボボックスで--------を選択したときに6桁を0にしたい場合です。コンボボックスでAを選択すると、6桁の数字をウィンドウに追加する6つの変数のそれぞれが0になります。したがって、Aを選択すると、「0 0 0 0 0 0」ではなく「0 12 1 0 0 -15」のようになります。現在のコードでは、私はそれを行うように見えません。 PyCharmは6つの変数を表示します:varP1fなど...エラーがあります - >ローカル変数の値は使用されていません。

この問題を解決するにはどうすればよいですか?

+0

は常に質問FULLエラーメッセージに入れて - その他の便利な情報があります。 – furas

+0

あなたは 'self.varP1f'を意味しましたか? – Natecat

+0

@ juanpa.arrivillaga - 重複はしばしば適用できますが、この場合は、再割り当てする整数ではなく、変更する必要のあるIntVarオブジェクトです。 – TigerhawkT3

答えて

1

あなたがtkinter.IntVarオブジェクトを使用しているとx = tkinter.IntVar(); x = 3のようなものは、そのx通常の整数ともはやIntVarようになりますよう、あなたは、ない再割り当てによって、そのset方法でそれらを設定する必要があります。このような

交換するすべての行:これにより

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

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

ありがとうございます。変数をよりわかりやすくユニークに保つことを忘れないでください。また、私はあなたのソリューションを試しましたが、コンボボックスからAを選択すると、シェルはこのエラー "UnboundLocalError:ローカル変数 'varP1ind'を代入の前に参照しています。 –

+0

@JasonM関数では、グローバル/グローバル変数を使用することを関数に通知するために 'global varP1f'などを使用する必要があります。または、これらの変数を 'self.'のクラスの中に入れ、' self.'をつけてください。 'IntVar'を' Label'でも使うことができるので 'StringVar'は必要ありません。 – furas

+0

@furas - 私はTigerhawkT3のソリューションを組み込んでいくつかの並べ替えを行い、ついにそれを実現させました。また、あなたのコメントを書き留めます。 –

関連する問題