Führen Sie Label mit tkinter aus. Weitere Informationen zum Anordnen von Rahmen und Etikett finden Sie unter [tkinter] Try using Label usw.
Ein Programm, das sich in die entgegengesetzte Richtung bewegt, wenn beide Enden von "label" an beiden Enden von Frame herauskommen.
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()
Um zu reproduzieren, wie sich das Label "bewegt", können Sie die Funktion rekursiv ausführen, die __1 Pixel nach links (rechts) __ bewegt. Das heißt, die Verschiebungsfunktion wird in der Verschiebungsfunktion aufgerufen, die 1 Pixel "Label" verschiebt.
label.after (n, f)
führt die Funktion f nach n Millisekunden aus, also setzt label.after (4, lambda: move (flag, i))
die x-Koordinate von label
auf 1. Führen Sie die Verschiebungsfunktion nach 4 Millisekunden in der Zeile (Zeile 14) unmittelbar vor dem Ende der zu ändernden Verschiebungsfunktion erneut aus. Dadurch wird eine Endlosschleife der Verschiebungsfunktion erstellt und die Beschriftung scheint zu funktionieren.
Eine Bindemethode, die die Funktion f ausführen kann, wenn auf ein Objekt geklickt wird (Linksklick, da es <1> ist, Rechtsklick, wenn <3>), z. B. "label.bind (<1>, f)". In der after-Methode, die die Funktion g nach n Millisekunden für ein bestimmtes Objekt wie "label.after (n, g)" ausführen kann, das zuvor eingeführt wurde, wird der Funktionsname in das zweite Argument eingefügt, aber wenn es so ist, wie es ist Argumente können nicht übergeben werden. Wenn Sie "label.after (n, move (flag, i))" schreiben, tritt ein Fehler auf. Dies liegt daran, dass move (flag, i) ()
tatsächlich aufgerufen wird.
Ich möchte zwei Möglichkeiten vorstellen, um dies zu lösen. __ (1) Notation mit Lambda (anonyme Funktion) __ Das heißt, es sollte "label.after (n, lambda: move (flag, i))" sein. Informationen zu Lambda finden Sie unter Python-Lambda ist leicht zu verstehen.
__ (2) Nestfunktion __ Nest = "verschachtelt". In Python können Sie eine andere Funktion innerhalb einer Funktion definieren. Wie bereits erwähnt, bezieht sich "label.after (n, move (flag, i))" tatsächlich auf "move (flag, i) ()" anstelle von "move (flag, i)". `So können Sie diese Form zwangsweise erstellen. Ich möchte dies nicht empfehlen, da der Code dazu neigt, schmutzig zu werden (während gesagt wird, dass Twitter-Suchergebnisse wie eine bestimmte Video-Site abspielen [Python] Es ist ein Geheimnis, dass einige Spaghetti viele verschachtelte Funktionen enthalten.
Der obige Beispielcode funktioniert ordnungsgemäß, wenn Sie Folgendes tun.
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
(Unterlassung)
i=400
flag=True
label.after(1,move(i))
root.mainloop()
schmutzig.
Recommended Posts