Es ist keine hohe Leistung (es gibt Unannehmlichkeiten in Bezug auf Transparenz und Standardfunktionen), aber da es Standard ist, werde ich es für mich als Memorandum zusammenfassen.
Wenn ich versuche, mit \ # Strg + C zu beenden, ist es ärgerlich, dass es nicht reagiert, bis ich das Fenster berühre
import tkinter as tk
root = tk.Tk() # Window
root.title('Hello Window') # Window title
root.geometry('%dx%d' % (400, 400)) # Window size (width, height)
#Initialisieren und platzieren Sie das Widget hier
root.mainloop()
Blockiere mit root.mainloop ()
. Verlassen Sie die Hauptschleife, wenn das Fenster geschlossen ist.
Um genau zu sein, scheint Tk eher die Hauptschleife von Tkinter als Window zu verwalten. Sie können das zweite und dritte Fenster mit tk.Toplevel
erstellen, wenn Sie mehrere Fenster für die Verwendung von Modal usw. erstellen (entspricht Form = VB.NET, Frame = Java). Im Fall von Java war es mir egal, weil ich denke, dass der Thread, der die Schleife für die GUI ausführt, aufsteht (er bleibt am Leben, auch wenn der Hauptthread, der die Hauptfunktion ausführt, endet), aber im Fall von Tkinter ist er explizit. Es scheint gezielt gehandhabt zu werden.
Wenn Sie nicht möchten, dass Tk selbst als Root-Fenster existiert (mit tk.Toplevel), können Sie es mit root.withdraw () entfernen. Die Logik von "Fenster geschlossen = Hauptschleife beenden = Programm beenden" funktioniert jedoch nicht (erinnert an Swings DefaultCloseOperation), daher root.destroy (erinnert mich an Swings DefaultCloseOperation) am Ende der Anwendung, um die Hauptschleife zu beenden. )
Anruf.
Zeigen Sie ein Fenster mit tk.Toplevel an, sodass die Hauptschleife endet, wenn ein bestimmtes Fenster geschlossen wird.
import tkinter as tk
root = tk.Tk()
root.withdraw()
window = tk.Toplevel(root)
window.title('Hello Window')
window.geometry('%dx%d' % (400, 400))
window.protocol('WM_DELETE_WINDOW', root.destroy)
#Initialisieren und platzieren Sie das Widget hier
root.mainloop()
Das Schließen von window
kann durch window.protocol ('WM_DELETE_WINDOW', handler_func)
(entsprechend WindowListener \ #windowClosing of Swing) erkannt werden.
window.protocol('WM_DELETE_WINDOW', root.destroy)
Schließlich wäre es in einer Anwendung wie einem einzelnen Fenster + Modal einfacher, Tk gehorsam als Hauptfenster zu behandeln.
frame = tk.Frame(root)
# frame = tk.Frame(root, bg='#FF00FF')
# frame['bg'] = '#FF00FF'
frame.place(x=8, y=8, width=200, height=200)
Panel(VB.NET/Java)/UIView(iOS)/ViewGroup(Android)的なやつ。Widgetのコンストラクタにbgとしてカラーコードを渡すと背景色を設定できる。初期化後に背景色を設定したい場合はディスクリプタ経由(widget['bg']
)で設定できる。
Label Label(VB.NET/Java)/UILabel(iOS)/TextView(Android)的なやつ。
label = tk.Label(root, text='Hello')
# label['text'] = 'Another text'
label.place(x=8, y=8)
def onHelloClicked(event):
print(event) # <ButtonPress event num=BUTTON_NUM x=MOUSE_X y=MOUSE_Y>
# print(event.x, event.y, event.num)
button = tk.Button(root, text='Hello')
# button = tk.Button(root, text='Hello', width=10)
# button['text'] = 'Another text'
button.bind('<Button-1>', onHelloClicked)
# button.bind('<Button-2>', onHelloClicked)
# button.bind('<Button-3>', onHelloClicked)
# button.bind('<Button>', onHelloClicked)
button.place(x=8, y=8)
# button.place(x=8, y=8, width=60)
# button.place(x=8, y=8, width=60, height=31)
Sie können "width" an den Konstruktor von Widget übergeben, aber die Einheit ist kein Pixel und schwer zu verstehen (Anzahl der Zeichen?).
Sie können einen Ereignishandler bei bind registrieren. <Button - *>
repräsentiert einen Mausklick (verwirrend, aber nicht mit dem tk.Button des Widgets verbunden). Klicken Sie mit der linken Maustaste auf "
# initialize button
# place button
root.update()
print(button.winfo_width(), button.winfo_height())
# root.mainloop()
In meiner Umgebung war winfo_width "36+ (width-1) * 8", als ich im Konstruktor die Breite an Button übergeben habe. Die Standard-Winfo-Breite (0 Zeichen) betrug 28 (Pixel). Wenn keine der beiden Breiten festgelegt ist, ändert sich winfo_width entsprechend der angegebenen Zeichenfolge. winfo_height ist 31 (Pixel), wenn kein Zeilenumbruch eingefügt wird, und wenn ein Zeilenumbruch eingefügt wird, wird der Zeilenumbruch in der Anzeige angezeigt und winfo_height wird automatisch erweitert.
from PIL import Image, ImageTk
# initialize root
image = Image.new('RGB', (128, 128), color=(255, 0, 255)) #Passendes Bild
image_tk = ImageTk.PhotoImage(image)
image_view = tk.Label(root, image=image_tk)
image_view.place(x=8, y=8)
# root.mainloop()
entry = tk.Entry(root, width=10)
entry.insert(tk.END, 'Hello') #Ursprünglicher Wert
print(entry.get()) # 'Hello'
entry.delete(0, tk.END) #klar
print(entry.get()) # ''
entry.place(x=8, y=8)
Der eingegebene Wert kann mit entry.get ()
abgerufen werden.
text = tk.Text(root, width=30, height=10)
text.insert(tk.END, 'Hello') #Ursprünglicher Wert
print(text.get('1.0', tk.END)) # 'Hello'
text.delete('1.0', tk.END) #klar
print(text.get('1.0', tk.END)) # ''
text.place(x=8, y=8)
Selbst wenn die Anzahl der Zeilen die Höhe überschritten hat, wurde die Bildlaufleiste nicht automatisch angezeigt. Außerdem hat Strg + A nicht funktioniert (an den Anfang der Zeile verschieben?). Obwohl die Verknüpfung zum Ausschneiden und Einfügen und die Zwischenablage verwendet werden konnten, war das Verhalten beim Auswählen von + Einfügen (Strg + V) seltsam (der ausgewählte Text wurde nicht überschrieben). Bleiben übrig). Einfach ohne Kontextmenü.
from tkinter.scrolledtext import ScrolledText
text = ScrolledText(root, width=30, height=10)
#Der Rest ist der gleiche
def onKeyPressed(event):
print(event)
# <KeyPress event keysym=a keycode=38 char='a' x=205 y=132>
# <KeyPress event keysym=Shift_L keycode=50 x=442 y=272>
# <KeyPress event state=Shift keysym=A keycode=38 char='A' x=127 y=183>
# print(event.keycode, event.char, event.state)
#state ist ein numerischer Wert (Modifikator)
#Standard 0
#Umschalt 1 (0b0001), Strg 4 (0b0100), Alt 8 (0b1000)
# Shift+Alt 9 (0b1001), Win+Schalten Sie auf 65 (0b01000001).
root.bind('<Key>', onKeyPressed)
Sie können mithilfe von Pack und Raster für die Widget-Platzierung einfüllen.
widget.pack_forget()
Nachtrag 2020/02/02: Auch wenn ich pack_forget auf das platzierte angewendet habe, ist es nicht gut verschwunden. Es sieht gut aus, destroy
zu verwenden.
widget.destroy()
root.attributes('-fullscreen', True)
# root.update()
# print(root.winfo_width(), root.winfo_height())
Schließen Sie mit Alt + F4.
root.wm_attributes('-topmost', 1)
root.bind('<Escape>', lambda e: root.destroy())
# root.bind('<Key-Escape>', lambda e: root.destroy())
root.bind('<Control-w>', lambda e: root.destroy())
Combobox
Es scheint FileChooser, ColorPicker, MessageBox usw. zu geben.
Recommended Posts