2017-10-17 2 views
1

Ich benutze ttk.Optionmenu() in meiner GUI aber bin genervt, dass, wenn es keine Mouse-Over-Bedingung gibt, das Menü/die Schaltfläche keine Visuals, die seinen Rahmen zeigen. Es gibt mir keine element_options, um zu sehen, ob ich das spezifische Styling für dieses Widget ändern kann.ttk.OptionMenu hat keine Umrandung/Umrandung

Ich würde es lieben, wenn es eine Möglichkeit für den Knopf gäbe, die ganze Zeit wie ein Knopf zu sehen, anstatt nur, wenn es den Fokus bekommt ... sonst sieht es irgendwie blaghh aus.

import tkinter as tk 
from tkinter import ttk 

root = tk.Tk() 

var = tk.StringVar(root) 
opmenu = ttk.OptionMenu(root, var, 'One', 'Two', 'Three') 
opmenu.pack() 

root.mainloop() 

Ich weiß, wie die style für die Widgets zu ändern, aber keines seiner Ruhe Aussehen adressieren. Ich habe versucht, zu googeln, in der Hoffnung, eine Lösung zu finden, aber ohne Erfolg. Mit Python 3.5.2 und tkinter 8.6

+0

Es ist nicht sehr klar, was das Problem ist. Wenn Sie Ihren Code unter Linux testen, ergibt sich die unterscheidbare Darstellung ähnlich einer Schaltfläche. Willst du zufällig Fenster benutzen? – kogito

+0

Ja ich benutze Windows ... sorry, ich habe vergessen, das in der Frage zu erwähnen. –

+0

Laut [Dokumentation] (http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/ttk-Menubutton.html) viele der typischen konfigurierbaren Funktionen des tkinter OptionMenu sind nicht für ttk verfügbar . Beachten Sie, dass der Style-Name für ttk OptionMenu TMenubutton ist. –

Antwort

1

Update:

Nach einigem Gräbt es sieht aus wie Sie den Stil weg von Fenstern beansprucht zwingen können, werden. Es sieht nicht so gut, aber ich denke, Sie in der Lage sein kann, Ihr Stil einzurichten, wie Sie aussehen wollen, nachdem Sie theme_use('clam')

Werfen Sie einen Blick auf dieses Beispiel verwendet haben:

import tkinter as tk 
from tkinter import ttk 

root = tk.Tk() 

var1 = tk.StringVar() 
var1.set("One") 

s = ttk.Style(root) 
s.theme_use('clam') 
s.configure('raised.TMenubutton', borderwidth=1) 

opmenu = ttk.OptionMenu(root, var1, "One", "One", "Two", "Three", 
         style = 'raised.TMenubutton') 

opmenu.pack() 

root.mainloop() 

Als Reaktion auf Ihr Kommentar eine Schaltfläche mit einem Popup-Menü verwenden könnten Sie so etwas tun:

import tkinter as tk 
from tkinter import ttk 

root = tk.Tk() 

popup = tk.Menu(root, tearoff=0) 
popup.add_command(label="One", command= lambda: update_btn("One")) 
popup.add_command(label="Two", command= lambda: update_btn("Two")) 
popup.add_command(label="Three", command= lambda: update_btn("Three")) 

btn = ttk.Button(root, text="One") 
btn.pack() 

def update_btn(x): 
    btn.config(text=x) 

def btn_popup(event): 
    try: 
     popup.tk_popup(event.x_root, event.y_root, 0) 
    finally: 
     popup.grab_release() 

btn.bind("<Button-1>", btn_popup) 

root.mainloop() 
+0

Danke dafür. Ihr Beispiel hat mich tatsächlich zum Nachdenken gebracht. Verwenden Sie jedoch eine normale Schaltfläche wie in Ihrem Beispielcode, anstatt die Optionsmenüschaltfläche mit der Maus nach vorne zu bewegen, wenn Sie darauf klicken. Es würde ein kontextuelles Menü öffnen ... Ich würde gerne lernen, wie man ttk-Widgets schreibt und dann einfach hineingeht und den Kerncode ändert, um es zu reparieren. –

+0

@ErniePeters Ich habe meine Antwort aktualisiert, als ich herausgefunden habe, wie man den Stil erzwingt. Sie müssen den Stil vollständig so konfigurieren, dass er der gewünschten Ästhetik entspricht, aber Sie können das OptionMenu im Zustand "raised" lassen. –

+0

@ErniePeters aber es sieht so aus, als wäre es eine Menge Arbeit, also denke ich, dass deine Idee, einen Button zu verwenden und dann ein Popup-Menü zu verwenden, besser funktionieren sollte. –

0

fand ich eine Lösung für dauerhaft die Grenze des vista-Stil zeigt:

import tkinter as tk 
from tkinter import ttk 

# Always show the active style 
def alwaysActiveStyle(widget): 
    widget.config(state="active") 
    widget.bind("<Leave>", lambda e: "break") 

root = tk.Tk() 

var = tk.StringVar(root) 
opmenu = ttk.OptionMenu(root, var, 'One', 'Two', 'Three') 
alwaysActiveStyle(opmenu) 
opmenu.pack() 

root.mainloop() 

Ich hoffe, dass es einige Probleme löst.