Exécutez Label avec tkinter. Reportez-vous à [tkinter] Try using Label pour les éléments de base tels que comment organiser le cadre et l'étiquette.
Un programme qui commence à se déplacer dans la direction opposée lorsque les deux extrémités de «label» sont sur le point de sortir des deux extrémités de Frame.
from tkinter import ttk
import tkinter
def move(flag,i):
if(flag==True):
i-=1
else:
i+=1
if(i==0):
flag=False
elif(i+label.winfo_reqwidth()==400):
flag=True
label.place(x=i,y=150)
label.after(4,lambda: move(flag,i))
w,h="400","300"
root=tkinter.Tk()
ttk.Style().configure("TP.TFrame", background="snow")
f=ttk.Frame(master=root,style="TP.TFrame",width=w,height=h)
f.pack()
fontsize=20
label=ttk.Label(master=root,text="Labeltext",font=("Meilio",fontsize),foreground="red",background="green")
i=400
flag=True
move(flag,i)
root.mainloop()
Pour reproduire comment l'étiquette «se déplace», vous pouvez exécuter de manière récursive la fonction qui déplace __1pixel vers la gauche (droite) __. Autrement dit, la fonction de déplacement est appelée dans la fonction de déplacement qui déplace 1 pixel «étiquette».
label.after (n, f)
exécute la fonction f après n millisecondes, donc label.after (4, lambda: move (flag, i))
définit la coordonnée x de label
sur 1. Exécutez à nouveau la fonction de déplacement après 4 millisecondes sur la ligne (ligne 14) immédiatement avant la fin de la fonction de déplacement à modifier. Cela crée une boucle infinie de la fonction de déplacement et donne l'impression que l'étiquette fonctionne.
Une méthode de liaison qui peut exécuter la fonction f lorsqu'un objet est cliqué (clic gauche car il est <1>, clic droit si <3>), comme label.bind (<1>, f)
. Dans la méthode after qui peut exécuter la fonction g après n millisecondes pour un certain objet comme label.after (n, g)
introduit plus tôt, le nom de la fonction est mis dans le deuxième argument, mais s'il est tel quel Impossible de passer des arguments. Si vous écrivez label.after (n, move (flag, i))
, une erreur se produira. C'est parce que move (flag, i) ()
est en fait appelé.
Je voudrais présenter deux façons de résoudre ce problème.
__ (1) Notation avec lambda (fonction anonyme) __
Autrement dit, cela devrait être label.after (n, lambda: move (flag, i))
.
Veuillez vous référer à Python lambda est facile à comprendre pour lambda.
__ (2) Fonction Nest __
Nest = "imbriqué". En Python, vous pouvez définir une autre fonction dans une fonction. Ici, comme introduit précédemment, label.after (n, move (flag, i))
se réfère en fait à move (flag, i) () au lieu de
move (flag, i) .
Donc, vous pouvez créer cette forme de force.
Je ne veux pas le recommander car le code a tendance à se salir (tout en disant que lire les résultats de recherche Twitter comme un certain site vidéo [python] C'est un secret que certains spaghettis contiennent de nombreuses fonctions imbriquées).
L'exemple de code ci-dessus fonctionne correctement si vous procédez comme suit.
from tkinter import ttk
import tkinter
def move(i):
def x():
global i
global flag
if(i==0):
flag=False
elif(i+label.winfo_reqwidth()==400):
flag=True
if(flag==True):
i-=1
else:
i+=1
label.place(x=i,y=150)
label.after(4,move(i))
return x
(Omission)
i=400
flag=True
label.after(1,move(i))
root.mainloop()
sale.
Recommended Posts