2017-03-27 15 views
0

私は問題が何であるかを知っています。それを修正する方法はわかりません。 self.healthは変数に一度格納され、その後は再読み込みされません。私は使ってみました:@property。しかし、私は昨日@propertyについて学んだだけなので、1:私はそれを正しく使用していないか、2:この状況では使用できません。クリックしたときにtxtが変化するtkinterボタン

import tkinter as tk 


class button_health: 
    def __init__(self): 
     self.health = 5 
    def hit(self, event): 
     self.health -= 1 
bob = button_health() 

window = tk.Tk() 
button = tk.Button(window, text = bob.health #I want this to update) 
button.bind("<Button-1>", bob.hit) 
button.pack() 

window.mainloop() 

私は何を目指してることは「5」と言ってから始まり、画面上の簡単なTkinterのボタンを生成するコードのためであるが、その後、あなたがそれをクリックすると、「4」と言い、その後、など「3」をクリックしてください

答えて

1

健康値への変更を追跡するためのTkinter IntVar変数を使用してください。その変数をtextvariable属性を使用してボタンラベルまでフックします。

import tkinter as tk 

class button_health: 
    def __init__(self, health=5): 
     self.health = tk.IntVar() 
     self.health.set(health) 

    def hit(self, event=None): 
     if self.health.get() >= 1: # assuming that you can't have negative health 
      self.health.set(self.health.get() - 1) 

window = tk.Tk() 
bob = button_health(8) 
button = tk.Button(window, textvariable=bob.health, command=bob.hit) 
#button = tk.Button(window, textvariable=bob.health) 
#button.bind('<Button-1>', bob.hit) 
button.pack() 

window.mainloop() 

もう一つの方法は、Buttonのサブクラスとして、独自のボタンクラスを作成し、クラスのメンバーとしてIntVarをフックアップすることです。このようにして、さまざまな健全性値を持つ複数の独立したボタンを簡単に作成できます。

import tkinter as tk 

class HealthButton(tk.Button): 
    def __init__(self, window, health=5, *args, **kwargs): 
     self.health = tk.IntVar() 
     self.health.set(health) 
     super(HealthButton, self).__init__(window, *args, textvariable=self.health, command=self.hit, **kwargs) 

    def hit(self): 
     if self.health.get() >= 1: 
      self.health.set(self.health.get() - 1) 

window = tk.Tk() 
buttons = [HealthButton(window, i) for i in range(10,15)] 
for b in buttons: 
    b.pack() 

window.mainloop() 
1

にはcommandという引数があります。ボタン1を関数にバインドすることは、ユーザーがボタンをクリックしたかどうかを確認する最善の方法ではありません。バインドを使用したとしても、クラスではなく関数にバインドする必要があります。 ボタンのテキストを変更するには、button['text']に何かを設定します。

import tkinter as tk 


def button_health(): 
    global health 
    health -= 1 
    button['text'] = str(health) 

health = 5 
window = tk.Tk() 
button = tk.Button(window, text = health , command = button_health) 
button.pack() 

window.mainloop() 

また、これを行うことにより、globalステートメントを使用して回避できます

import tkinter as tk 

def button_health(but): 
    but.health -= 1 
    but['text'] = str(but.health) 

window = tk.Tk() 
button = tk.Button(window) 
button.health = 5 
button['text'] = str(button.health) 
button['command'] = lambda: button_health(button) 
button.pack() 

window.mainloop() 
このようにそれを行うためのもう一つの利点は、あなたが複数持っている場合、それは独立したボタンの健康を保つため、できることです

これにより、すべてのボタンのカウンターが異なる状態に保たれます。

+0

ありがとうございました。私はあなたの反応を完全に理解するために少し勉強しなければならないでしょう(私は前にラムダを使ったことはありません)。しかし、それは良いようです。 私は、2番目のソリューションの構文に従うことに苦労しています。私はまだPythonでかなりのnoobです。 button.health = 5#この種の構文は以前に発生していません。私はこれが何をするのか分からない。それはボタン内の "健康"と呼ばれる変数を作成し、それに5を割り当てますか? –

+0

'button.health = 5'は' button'内に 'health'という名前の*属性*を作成します。そうすれば、誰が健康であるかを把握するのが簡単になります。 'button.health'の' health'は常に 'button'に一意です。 – abccd

+0

私の場合のlambdaは、 'command'が定義された後に 'button_health(button)'が実行されないようにします。 – abccd

1

使用button['text']またはbutton.config(text={text})

class button_health: 
    def __init__(self): 
     self.health = 5 
    def hit(self, event): 
     self.health -= 1 
     button['text'] = str(self.health) 

または

class button_health: 
    def __init__(self): 
     self.health = 5 
    def hit(self, event): 
     self.health -= 1 
     button.config(text= str(self.health)) 
関連する問題