Hab da inzwischen auch einen schlichteren Workaround gefunden (einfach zwei PNGs links und rechts vom TkEntry-Widget). Sieht zwar okay aus, aber ich vermute das ist nicht sonderlich einheitlich auf verschiedenen Plattformen, mit unterschiedlichen System-Schriften oder Tcl/Tk-Versionen:
Und jetzt stellt sich die Frage ob man das nicht auch besser lösen kann. Mir ist aufgefallen dass hinter dem Eingabefeld bereits ein Canvas existiert. (Unklar ob das jetzt PSG eingefügt hat, oder durchs Tk-Thema automatisch reinkommt).
Jedenfalls könnte man mit dem Canvas ja theoretisch hinter das Input()-Feld zeichnen. Letztlich einfach ne Ellipse und nen Block, um ein abgerundetes Feld zu simulieren. Hab dass hier mal "vereinfacht" (so dass die Struktur aber noch identisch bleibt):
Code: Alles auswählen
#!/usr/bin/env python3
import tkinter as tk, PySimpleGUI as sg # ⚠ install python3-tk / tkinter in your distro package manager
#-- widget structure
layout = [[
sg.Menu([["File", ["Exit"]]], key="menu", font="Sans 11"),
# left pane: blue/gray
sg.Column(size=(320,725), background_color="#343131", pad=(0,0), layout=[
[sg.Column( background_color="#2980b9", size=(320,105), pad=(0,0), element_justification="center", layout=[
[ sg.T("title text", text_color="#fff", pad=[(20,0),(10,0)], background_color="#2980b9", font="Sans 12 bold") ],
[ sg.T("filler", text_color="#65a3c8", pad=[(20,0),(0,5)], background_color="#2980b9") ],
[
sg.Input(" find.. ", key="search", font="Sans 12", size=(26,1), pad=(0,0), background_color="#fefefe", border_width=0)
],
])],
[sg.Multiline("├── btn.png\n├── build\n│ ├── bdist.linux-x86_64", background_color="#555", size=[15,20])]
]),
# content pane: white
sg.Column(size=(760,725), background_color="#fafafa", pad=((30,5),(10,5)), layout=[
[sg.T("Content")],
[sg.Multiline(size=(75,27))],
]),
]]
#sg.theme("DarkBlue2")
win = sg.Window(
title="test3", layout=layout, font="Sans 12", size=(1080,725), margins=(0,0),
resizable=False, background_color="#fafafa", ttk_theme=None
)
sg.theme("DarkRed")
win = sg.Window(
title="test3", layout=layout, font="Sans 12", size=(1080,725), margins=(0,0),
resizable=False#, ttk_theme=None
)
# initialize widgets
win.read(timeout=1)
#----- patch Canvas behind search field -----
w = win["search"].Widget # == .!toplevel.!frame.!tkfixedframe.!canvas.!frame.!frame.!tkfixedframe.!canvas.!frame.!frame3.!entry
canvas = win.TKroot.nametowidget(".!toplevel.!frame.!tkfixedframe.!canvas.!frame.!frame.!tkfixedframe.!canvas")
print(dir(w))
#w.configure(background="") # → _tkinter.TclError: unknown color name ""
w.master.configure(background="") # frame around entry widget
w.master.master.configure(background="") # wrapper frame
print(canvas)
print(dir(canvas))
print(canvas.winfo_x(), canvas.winfo_y(), canvas.winfo_width(), canvas.winfo_height()) # 320x105
canvas.create_line( 0, 9, 320, 105, fill="red", width=10)
canvas.create_oval(10, 15, 300, 95, fill="green")
# sg wait
win.read()
Code: Alles auswählen
hier Ellipse malen
↓
.!toplevel.!frame.!tkfixedframe.!canvas.!frame.!frame.!tkfixedframe.!canvas.!frame.!frame3.!entry
↑
Eingabefeld
Jetzt hab ich natürlich im zweiten Schritt schon probiert die `background_color=` Parameter wegzulassen, oder das sg.theme() nicht zu setzen. Aber die Frames behalten einen festen Hintergrund. Im zweiten Beispiel sieht man dass sogar durch den Abstandsparameter `pad=(…)` das Frame mit HG-Farbe vergrößert wird.
Und `w.master.configure(background="")` (das wäre der erste Frame unter dem Entry) hat scheinbar null Effekt.
Und an der Stelle bin ich mir nicht sicher was ich noch probieren könnte. Entweder fixiert PySimpleGUI das irgendwie, oder die TkWidgets lassen sich nach der Erstellung nicht mehr anpassen. Könnte auch mit dem Thema zusammenhängen, oder den Style-Defaults o.ä. Mit -colormap z.B. lässt sich da aber auch nichts ändern.