2016-07-03 17 views
2

Könnte jemand empfehlen, wie man eine Bezeichnung mit einer Skala in Python abruft und aktualisiert. Derzeit zeigt es eine sehr große reelle Zahl. Ich habe versucht, den Wert einzugeben, aber das funktioniert nur, wenn ich im Leerlauf drucke. Ich habe slider.get() versucht, aber das Label ist leer. Probieren Sie auch int (slider.get()), was funktioniert, wenn ich im Leerlauf drucke.Tkinter Python Scale retrieving Ganzzahlwert

from tkinter import * 
from tkinter import ttk 

root = Tk() 
root.title("Playing with Scales") 

mainframe = ttk.Frame(root, padding="24 24 24 24") 
mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 

slider = IntVar() 

ttk.Scale(mainframe, from_=0, to_=100, length=300, variable=slider).grid(column=1, row=4, columnspan=5) 
ttk.Label(mainframe, textvariable=slider).grid(column=1, row=0, columnspan=5) 

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5) 


root.mainloop() 

Here you can see the very large real value

+1

Das ist keine große reelle Zahl, es hat nur eine Menge Nachkommastellen, aber ich denke, das macht es unordentlich. Ich sehe keine Möglichkeit, die Auflösung des Skalierungswidgets zu steuern, aber es ist ziemlich einfach, die erzeugte Zeichenfolge zu ändern. Ich werde in Kürze einen Code posten. –

Antwort

3

Ich sehe keinen Weg, um die Auflösung des Scale-Widget zu steuern, aber es ist ziemlich einfach, die Zeichenfolge zu ändern, die es produziert. Laut these ttk docs gibt das Skalierungs-Widget einen Gleitkommawert zurück, aber in meinen Experimenten gibt es einen String zurück, der etwas nervig ist.

Anstatt das Etikett Text direkt von der slider variable Einstellung auf den Maßstab Widget angebracht können wir einen Befehl an das Skalieren Widget binden, die die Zeichenfolge konvertiert die Skala der aktuelle Wert wieder auf einen Schwimmer hält, und formatiert dann diese Schwimmer mit der gewünschte Anzahl von Ziffern; Der folgende Code zeigt 2 Nachkommastellen an.

import tkinter as tk 
from tkinter import ttk 

root = tk.Tk() 
root.title("Playing with Scales") 

mainframe = ttk.Frame(root, padding="24 24 24 24") 
mainframe.grid(column=0, row=0, sticky=('N', 'W', 'E', 'S')) 

slider = tk.StringVar() 
slider.set('0.00') 

ttk.Scale(mainframe, from_=0, to_=100, length=300, 
    command=lambda s:slider.set('%0.2f' % float(s))).grid(column=1, row=4, columnspan=5) 

ttk.Label(mainframe, textvariable=slider).grid(column=1, row=0, columnspan=5) 

for child in mainframe.winfo_children(): 
    child.grid_configure(padx=5, pady=5) 

root.mainloop() 

Wenn Sie nur das Etikett den Integer-Wert angezeigt werden dann die Initialisierung slider ändern

slider.set('0') 

und die Callback-Funktion

lambda s:slider.set('%d' % float(s)) 

ändern I‘ Einige kleinere Änderungen an Ihrem Code vorgenommen. In erster Linie habe ich den "Stern" Import durch import tkinter as tk ersetzt; Der Star-Import bringt über 130 Namen in deinen Namespace, was viel unnötige Unordnung verursacht, wie ich in this recent answer erwähnt habe.

+1

@BillalBEGUERADJ: Ah, guter Punkt. Ich habe es versäumt, den Titel der Frage noch einmal zu lesen. :) –

+0

Danke. Ich dachte, ich hätte versucht, der Waage einen Befehl hinzuzufügen, aber vielleicht auch nicht. Funktioniert perfekt; Ich wollte nur die ganze Zahl :) – Mike

2

Eine andere weniger komplizierte Option und einfache Alternative zu verwenden, ist eine Instanz von tkinter.Scale() Klasse zu verwenden, mit denen Sie die resolution Option, was auch immer Wert injizieren können Sie wollen. Der Standardwert ist derjenige, den Sie suchen, da sein Wert 1 ist

+1

Guter Rat; Ich würde das fast selbst vorschlagen, aber ich beschloss zu sehen, was ich mit ttk machen konnte. Ich habe Python 3 erst kürzlich installiert und ttk noch nie benutzt. –

+0

Ja danke dafür. Ich habe es mit tkinter geschafft, aber die GUI ist moderner in ttk, aber weniger dokumentiert, weshalb ich stecken geblieben bin, denke ich. – Mike