2017-12-05 25 views
0

私はPythonを学ぶ練習をしています。 基本的には、tkinterを使って2つの円を作成し、ボタンを使ってそれらを動かしている間にそれらの間の距離を計算するはずです。 '変更'ボタンは、円を入れ替えることです。 私の問題は、最初にコードを起動したときに距離が表示されますが、円を移動しているときに更新されないということです。 画面上に距離を表示するにはラベルクラスを使用します。以下 コード:あなたはStringVar()textvariable=を使用していない場合はPython // tkinterラベル更新デー​​タ

from tkinter import * 
from math import sqrt 
# procédure générale de déplacement : 
def avance(lat1=0, vert1=0,lat2=0,vert2=0): 
    global x1, y1,x2,y2,dist 
    x1, y1 = x1 +lat1, y1 +vert1 
    x2, y2 = x2 +lat2, y2 +vert2 
    if flag==0: 
     can1.coords(oval1, x1,y1, x1+60,y1+60) 
    else: 
     can1.coords(oval2, x2, y2, x2 + 30, y2 + 30) 

    dist=calculdist(x1,y1,x2,y2) 
    return dist 

def calculdist(x1,y1,x2,y2): 
    dist=sqrt((x2-x1)**2+(y2-y1)**2) 
    dist= str(dist) 
    return dist 

# gestionnaires d'événements : 
def depl_gauche(): 
    if flag==0: 
     avance(-10, 0) 
    else: 
     avance(0,0,-10,0) 
def depl_droite(): 
    if flag==0: 
     avance(10, 0) 
    else: 
     avance(0,0,10,0) 
def depl_haut(): 
    if flag==0: 
     avance(0, -10) 
    else: 
     avance(0,0,0,-10) 
def depl_bas(): 
    if flag==0: 
     avance(0, 10) 
    else: 
     avance(0,0,0,10) 

def which(): 
    global flag 
    if flag==0: 
     flag=1 
    elif flag==1: 
     flag=0 

#------ Programme principal ------ 
# les variables suivantes seront utilisées de manière globale : 
x1, y1,x2,y2 =100,100,300,300 # coordonnées initiales 
flag=0 

fen1 = Tk() 
fen1.title("Exercice d'animation avec tkinter") 

can1 = Canvas(fen1,bg='light grey',height=500,width=500) 
oval1 = can1.create_oval(x1,y1,x1+60,y1+60,width=2,fill='red') 
oval2 = can1.create_oval(x2,y2,x2+30,y2+30,width=2,fill='blue') 

can1.pack(side=LEFT) 
Button(fen1,text='Quitter',command=fen1.quit).pack(side=BOTTOM) 
Button(fen1,text='Gauche',command=depl_gauche).pack() 
Button(fen1,text='Droite',command=depl_droite).pack() 
Button(fen1,text='Haut',command=depl_haut).pack() 
Button(fen1,text='Bas',command=depl_bas).pack() 
Button(fen1,text='Change',command=which).pack() 
Label(fen1, text = 'distance :'+calculdist(x1,y1,x2,y2)).pack() 

fen1.mainloop() 
+0

ラベルを手動で更新する必要があります。あなたが 'textvariable ='と 'StringVar()'を使わないと自動ではできません。 – furas

答えて

1

Labelが自動的に更新されません。
しかし、あなたはそれへのアクセス権を持っている変数にLabelを割り当てる必要がありtextvariableStringVar

まずずにテキストを手動で更新することができます。

lab = Label(fen1, text = 'distance :'+calculdist(x1,y1,x2,y2)) 
lab.pack() 

以降avanceにあなたは

lab['text'] = 'distance :'+calculdist(x1,y1,x2,y2) 

EDIT使用してテキストを変更することができます。ところで

import tkinter as tk 
from math import sqrt 

def avance(lat1=0, vert1=0, lat2=0, vert2=0): 
    global x1, y1, x2, y2 

    x1 += lat1 
    y1 += vert1 
    x2 += lat2 
    y2 += vert2 

    if flag == 0: 
     can1.coords(oval1, x1, y1, x1+60, y1+60) 
    else: 
     can1.coords(oval2, x2, y2, x2+30, y2+30) 

    lab['text'] = 'distance: '+calculdist(x1,y1,x2,y2) 

def calculdist(x1, y1, x2, y2): 
    dist = sqrt((x2-x1)**2+(y2-y1)**2) 
    #dist = str(dist) 
    dist = "{:10.5f}".format(dist) 
    return dist 

def depl_gauche(): 
    if flag == 0: 
     avance(-10, 0) 
    else: 
     avance(0, 0, -10, 0) 

def depl_droite(): 
    if flag == 0: 
     avance(10, 0) 
    else: 
     avance(0, 0, 10, 0) 

def depl_haut(): 
    if flag == 0: 
     avance(0, -10) 
    else: 
     avance(0, 0, 0, -10) 

def depl_bas(): 
    if flag == 0: 
     avance(0, 10) 
    else: 
     avance(0, 0, 0, 10) 

def which(): 
    global flag 

    if flag == 0: 
     flag = 1 
    elif flag == 1: 
     flag = 0 

#------ 

x1 = 100 
y1 = 100 
x2 = 300 
y2 = 300 
flag = 0 

fen1 = tk.Tk() 
fen1.title("Exercice d'animation avec tkinter") 

can1 = tk.Canvas(fen1, bg='light grey', height=500, width=500) 
oval1 = can1.create_oval(x1, y1, x1+60, y1+60, width=2, fill='red') 
oval2 = can1.create_oval(x2, y2, x2+30, y2+30, width=2, fill='blue') 

can1.pack(side='left') 

tk.Button(fen1, text='Quitter', command=fen1.destroy).pack(side='bottom') 
tk.Button(fen1, text='Gauche', command=depl_gauche).pack() 
tk.Button(fen1, text='Droite', command=depl_droite).pack() 
tk.Button(fen1, text='Haut', command=depl_haut).pack() 
tk.Button(fen1, text='Bas', command=depl_bas).pack() 
tk.Button(fen1, text='Change', command=which).pack() 

lab = tk.Label(fen1, text='distance: '+calculdist(x1, y1, x2, y2)) 
lab.pack() 

fen1.mainloop() 

それをより読みやすくするためのより優れたフォーマットで完全なコードを:を参照

+0

ありがとう、完璧に動作します。私はPEP 8も見ています:) –

関連する問題