簡體   English   中英

Python // tkinter標簽更新數據

[英]Python//tkinter label update data

我正在做一個練習來學習python。 基本上我應該使用tkinter創建2個圓並在使用按鈕移動它們時計算它們之間的距離。 “更改”按鈕用於交換圈子。 我的問題是,距離是在我第一次啟動代碼時顯示的,但是當我移動圓圈(它應該)以在屏幕上顯示距離時,它不會更新(我使用標簽類)。 下面的代碼:

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()

如果您不對StringVar()使用textvariable= ,則Label不會自動更新。
但是您可以手動更新文本,而無需使用textvariableStringVar

首先,您必須將Label分配給變量才能訪問它。

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

后來在avance您可以使用更改文本

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

編輯:具有更好格式的完整代碼,使其更具可讀性

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()

順便說一句:請參閱PEP 8-Python代碼樣式指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM