2017-01-23 33 views
-2

IntVar()を使用しても、ラベル内の変数を更新できません。私はおそらく慢性的に何かをやっている。変数を変更してラベルを更新するNimゲームを作成しようとしました。Python 3 Tkinterラベルを更新/更新するには? Nim Game

 # ministry of trade 
     from tkinter import * 
     import random 

     # create root window 
     root = Tk() 

     # ministry of variables 
     lst_choice = [1,2] 
     lst_player = [1,2] 
     player=random.choice(lst_player) #set random player 
     playervar = StringVar() 
     playervar.set(player) 

     # Set the initial state 
     state=7 # number of objects 
     statevar = IntVar() 
     statevar.set(state) 

     winner=0 
     winnervar = IntVar() 
     winnervar.set(winner) 

     move=0 
     movevar = IntVar() 
     movevar.set(move) 

     def move1(): 
                   # move is assigned 
       global statevar 
       global playervar 
       global winnervar 

       if statevar.get()>0: 
        statevar.set(statevar.get() - 1) 
        print(statevar.get())     #for testing only 
        return statevar 

       if statevar.get()==0:    # check win status - win, lose, stalemate 
        winnervar.set(playervar.get()) 
        print(winnervar.get())     #for testing only 
        return winnervar 

       if playervar.get()==1:   # switch players 2->1, 1->2 go back to the valid move line 
        playervar.set(2) 
        print(playervar.get())     #for testing only 
        return playervar 

       else: 
        playervar.set(1) 
        print(playervar.get())     #for testing only 
        return playervar 
       root.update_idletasks() 
     def move2(): 
      return 
     # Holy Roman Empire of the Widget Nation 
     # electorate of Label 

     labelAantalMunten = Label(root, text=("Aantal munten op stapel ",statevar.get())) #state 
     labelAantalMunten.pack() # orders to add the widget label to the root window and display it 

     labelWelkSpeler = Label(root, text=("Nu is speler ",playervar.get()," aan de beurt")) #player 
     labelWelkSpeler.pack() 

     labelWelkWinaar = Label(root, text=("Speler ",winnervar.get()," heeft gewonnen!")) #winner 
     labelWelkWinaar.pack() 

     # electorate of Button 
     button1 = Button(root, text="neem 1 steen", command=move1) 
     button1.pack() 

     button2 = Button(root, text="neem 2 stenen", command=move2) 
     button2.pack() 


     # start the main events loop  
     root.mainloop() 
+0

"できない" とは何を意味するのでしょうか?なぜあなたはできないのですか?エラーが出ていますか?プログラムはクラッシュしますか? –

答えて

1

以下は、ボタンを押すたびにラベル表示を更新するために行うべき作業の例です。

  • textの代わりにtextvariableを使用する必要があります。
  • メインコードにStringVar変数を宣言し、関数mov1で変数を更新する必要があります。
  • 文字列を StingVar変数に渡す前に文字列を取得する方法の例を示します。

楽しくお楽しみください!

例コード

# ministry of trade 
from tkinter import * 
import random 

# create root window 
root = Tk() 

# Set the initial state 
state=7 # number of objects 
statevar = IntVar() 
statevar.set(state) 

def move1(): 
           # move is assigned 
    global statevar 

    if statevar.get()>0: 
     print('statevar.get()>0') 
     print(statevar.get()) #for testing only 
     statevar.set(statevar.get() - 1) 
     print(statevar.get()) #for testing only 
     a = "Aantal munten op stapel " + str(statevar.get()) 
     print('a = {}'.format(a)) 
     text1.set(a) 
     return statevar 

a = "Aantal munten op stapel " + str(statevar.get()) 
text1=StringVar() 
text1.set(a) 
labelAantalMunten = Label(root, textvariable=text1) #state 
labelAantalMunten.pack() # orders to add the widget label to the root window and display it 

# electorate of Button 
button1 = Button(root, text="neem 1 steen", command=move1) 
button1.pack() 

# start the main events loop  
root.mainloop() 
+0

ありがとうございます。 – Tourah

+0

実行時にラベルを更新するために 'textvariable'と' StringVar'を使用する必要はありません。それは_a_メソッドですが、_only_メソッドはありません。 –

0
labelWelkSpeler = Label(root, text=("Nu is speler ",playervar.get()," aan de beurt")) #player 

これは、ONCE playervarの値を取得します(一度にラベルを作成する)、そしてその時にラベルのテキストを作成します。 (あなたが書いたものは文字列の連結ではなく、タプル構造であるため、実際に望むテキストは作成されません)。playervarが変更されるたびにこのコードが再実行されることはありません。

変数から自動更新するラベルを取得する唯一の方法は、textvariable=というオプションで指定することです(text=ではなく)。変数は、表示されるテキスト全体を保持しなければならないので、IntVarではなく、ほぼ確実にStringVarになります。別の変数(普通のPython変数、ほとんどの場合)でプレーヤーのスコアを保持し、StringVarが変更されるたびに.set()する必要があります。

+0

ありがとうございました。 – Tourah

関連する問題