Параметр формата Python 3 ttk.Spinbox - PullRequest
0 голосов
/ 15 июня 2019
import tkinter as tk
import tkinter.ttk as ttk


root = tk.Tk()
style = ttk.Style()
style.theme_use('vista')

spinbox = ttk.Spinbox(root, from_=0, to=100, increment=5, format='%10.2f')
spinbox.set('{:10.2f} %'.format(0))  # default value

spinbox.pack()

root.minsize(400, 100)  # make window larger for ease of finding for this simple example
root.mainloop()

Я хотел бы добавить буквенный символ процента к опции ttk.Spinbox format = '% 10.2f' . Поэтому, когда вы увеличиваете или уменьшаете значения, после значения всегда отображается символ%. Это кажется болезненно трудным для достижения, и я полагаю, что я виноват в том, что упустил нечто очень простое / очевидное. Вы можете добавить любую строку здесь, и она работает, но она не работает с буквенным символом%, поскольку значение строки, заданное для формата параметра, содержит символ%, который требуется иметь.

Первое, что я попробовал, было экранирование символа%, который я хочу отобразить, и он не работал, например: format='%10.2f\\%'.

Я в своей способности перепробовал все, что мог придумать в опции формата, но не могу показать символ%. Это на самом деле не проблема, но было бы неплохо, если бы кто-нибудь знал о решении, спасибо.

Ответы [ 2 ]

1 голос
/ 22 июня 2019

Итак, я установил Python 3.7.3 и нашел решение. Вы должны использовать %% в строке формата, чтобы получить литерал %. Однако установка начального значения, например, spinbox.set(0.0) не применяет формат автоматически, хотя docs говорит, что должно.

1 голос
/ 17 июня 2019

Вы можете создать подкласс ttk.Spinbox, чтобы изменить его поведение, чтобы отобразить желаемый формат, вместе с единицей в записи spinbox:

import tkinter as tk
import tkinter.ttk as ttk


class FormattedSpinbox(ttk.Spinbox):
    """A ttk.Spinbox that displays a float with 2 decimals,
    alongside a '%' character unit
    """
    def __init__(self, master, **kwargs):
        kwargs['command'] = self.command
        super().__init__(master, **kwargs)
    def set(self, value):
        super().set(value)
        self.command()
    def get(self):
        return float(super().get().strip().split()[0])
    def command(self):
        value = self.get()
        self.delete(0, tk.END)
        self.insert(0, f'{float(value): 10.2f} %')


root = tk.Tk()

spinoptions = {'from_': 0, 'to': 100, 'increment': 5}
spinbox = FormattedSpinbox(root, **spinoptions)
spinbox.set(0)  # default value
spinbox.pack()

root.minsize(400, 100)
root.mainloop()

виджет выглядит так:

enter image description here

В качестве альтернативы, если вы хотите параметризовать формат, вы можете сделать это следующим образом. Обратите внимание, что str(value).format(format) не полностью эквивалентен f'{float(value): 10.2f} %'); первый не добавляет пробела для заполнения требуемой ширины, а число десятичных дробей равно как минимум одному, вплоть до требуемого числа, если значение несет достаточную точность.

import tkinter as tk
import tkinter.ttk as ttk


class FormattedSpinbox(ttk.Spinbox):
    """A ttk.Spinbox that displays a float with 2 decimals,
    alongside a '%' character unit
    """
    def __init__(self, master, **kwargs):
        kwargs['command'] = self.command
        super().__init__(master, **kwargs)
    def set(self, value):
        super().set(value)
        self.command()
    def get(self):
        return float(super().get().strip().split()[0])
    def command(self):
        value = self.get()
        self.delete(0, tk.END)
        svalue = str(value).format(format)
        self.insert(0, f'{svalue} %')


root = tk.Tk()

spinoptions = {'from_': 0, 'to': 100, 'increment': 5, 'format':'%10.2f'}
spinbox = FormattedSpinbox(root, **spinoptions)
spinbox.set(0)  # default value
spinbox.pack()

root.minsize(400, 100)
root.mainloop()

виджет теперь выглядит так:

enter image description here

...