2016-11-24 2 views
-1

Ich arbeite mit Python 3.5 und TKinter. Ich habe einen Label- und Dateidialog definiert, der dieses Label aktualisiert. Eine Schaltfläche ist dafür verantwortlich, diesen Dialog zu starten.Button Verhalten

self.sel_folder_val = the label that will be updated. 
The code: 
self.sel_folder_val['text']=filedialog.askdirectory() 

Nach dem Drücken der Taste, um diesen Dialog zu starten, bleibt die Taste gedrückt. Jeder Dialog, für den eine Schaltfläche zuständig ist, bewirkt, dass die Schaltfläche nach dem Schließen dieses Dialogfelds niedrig bleibt (gedrückt). Ich habe versucht, dies auch ohne Hilfe ...:

self.select_folder_btn.config(relief=RAISED) 

Code-Beispiel:

self.select_folder_btn = Button(self.top) 
self.select_folder_btn.place(relx=0.07, rely=0.57, height=34, width=187) 
self.select_folder_btn.configure(activebackground="#d9d9d9") 
self.select_folder_btn.configure(activeforeground="#000000") 
self.select_folder_btn.configure(background="#d9d9d9") 
self.select_folder_btn.configure(disabledforeground="#a3a3a3") 
self.select_folder_btn.configure(font=self.font3) 
self.select_folder_btn.configure(foreground="#000000") 
self.select_folder_btn.configure(highlightbackground="#d9d9d9") 
self.select_folder_btn.configure(highlightcolor="black") 
self.select_folder_btn.configure(pady="0") 
self.select_folder_btn.configure(text='''Select destination folder''') 
self.select_folder_btn.bind('<Button-1>',self.update_folder_value) 

def update_folder_value(self,event): 
    self.sel_folder_val['text']=filedialog.askdirectory() 
return 

Nach der Ausführung update_folder_value() Funktion, bleibt self.select_folder_btn nach unten.

+0

Bitte poste ein minimales Codebeispiel: http://stackoverflow.com/help/mcve – kabanus

+0

@kabanus code wurde hinzugefügt. – Orenl

+0

Zum einen, verwenden Sie nicht "bind" auf Schaltflächen. Verwenden Sie die Option 'command' und lassen Sie tkinter sich Gedanken über die Ereignisbindungen machen. –

Antwort

1

Erste für die Zukunft ist dies ein minimales Arbeitsbeispiel:

from Tkinter import * 
import tkFileDialog as filedialog 

class app: 
    def __init__(self): 
     self.top = Tk() 
     self.select_folder_btn = Button(self.top) 
     self.select_folder_btn.place(relx=0.07, rely=0.57, height=34, width=187) 
     self.select_folder_btn.configure(activebackground="#d9d9d9") 
     self.select_folder_btn.configure(activeforeground="#000000") 
     self.select_folder_btn.configure(background="#d9d9d9") 
     self.select_folder_btn.configure(disabledforeground="#a3a3a3") 
     #self.select_folder_btn.configure(font=self.font3) 
     self.select_folder_btn.configure(foreground="#000000") 
     self.select_folder_btn.configure(highlightbackground="#d9d9d9") 
     self.select_folder_btn.configure(highlightcolor="black") 
     self.select_folder_btn.configure(pady="0") 
     self.select_folder_btn.configure(text='''Select destination folder''') 
     self.select_folder_btn.configure(command=self.update_folder_value) 
     self.sel_folder_val = {} 
     self.top.mainloop() 

    def update_folder_value(self): 
     self.sel_folder_val['text']=filedialog.askdirectory() 
     self.top.update_idletasks() 
app() 

und das ist auch nicht minimal. Zweitens ist Ihr Problem schwer zu finden, da dies nicht minimal ist - Sie tun etwas wirklich seltsam - Bindung der Schaltfläche mit einem Klick. Sie überschreiben die integrierte Bindung und anscheinend beeinflusst es immer noch den Status der Schaltfläche beim Drücken, aber nicht zurück. Was man wollte ist:

self.select_folder_btn.configure(command=self.update_folder_value) 

anstelle Ihres:

self.select_folder_btn.bind('<Button-1>',self.update_folder_value) 

Sie auch, dass in der Button Befehl definieren könnten. Was Sie getan haben, ist der Knopfmechanismus umgangen worden, also wird offenbar nur die Hälfte davon ausgeführt, und die Erleichterung wird nicht erhöht. Beachten Sie, dass Sie den Ereignisparameter entfernen müssen, den Ihre Methode akzeptiert.

+0

Ich denke, Ihr Beispiel wäre ein bisschen besser, wenn Sie die Verwendung von 'Lambda' entfernen würden. 'Lambda' wird zu oft verwendet und verwirrt viele Anfänger. –

+0

Ups, es ist sogar nicht "klassisch", es hier zu setzen - beachten Sie, dass die Zeile unten ohne es ist. Ich weiß nicht, warum ich es in den obigen Code geschrieben habe. – kabanus

1

verwendete ich den Befehl:

self.select_folder_btn.configure(command=self.update_folder_value) 

Statt binden:

self.select_folder_btn.bind('<Button-1>',self.update_folder_value) 

Es ist mein Problem gelöst. Danke

Verwandte Themen