Невозможно позиционировать содержимое кнопки ни с привязкой, ни с выравниванием - PullRequest
0 голосов
/ 14 марта 2019

У меня есть динамическая метка кнопки, которая меняется при каждом нажатии. Проблема в том, что когда текст на кнопке изменяется, то же самое касается ширины кнопки. По этой причине я установил фиксированную ширину для моей кнопки.

После этого появилась другая проблема. Содержимое центрируется внутри кнопки, поэтому при каждом изменении изображения и метки немного двигаются. По этой причине я попытался расположить все с левой стороны, чтобы уменьшить дрожание контента.

Я просмотрел документы и обнаружил, что виджет кнопки поддерживает опцию привязки для позиционирования контента. Однако, когда я пытаюсь это сделать, я получаю сообщение об ошибке:

_tkinter.TclError: неизвестная опция "-anchor"

Я нашел другой вариант, обоснуйте, но результат тот же:

_tkinter.TclError: неизвестный параметр "-justify"

Кто-нибудь знает, как с этим бороться? Я поделюсь с вами своим кодом:

self.btnServiceIo = ttk.Button(
    top_buttons_frame,
    text="Usługa automatyczna",
    image=self.ioBtnImg_off,
    compound=tk.LEFT,
    width=30,
    justify=tk.LEFT,
    anchor='w')
self.btnServiceIo.pack(side=tk.LEFT)
self.btnServiceIo.bind("<ButtonRelease>", self.IObuttonToggle)

(я не использую justify и anchor одновременно, я просто разместил их вместе, чтобы показать вам, как я их использую) Я выложу картинку моего приложения для вашего внимания. Мой клиент хотел бы иметь не только изображение переключения, в котором указано состояние какого-либо сервиса, но и текстовую информацию поблизости. enter image description here

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Для кнопок ttk вы можете установить опцию привязки в стиле ttk, см. Запись привязки на этой странице .

Так, например:

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk

root = tk.Tk()

s = ttk.Style()
s.configure('TButton', anchor=tk.W)

buttonImage = Image.open('test.png')
buttonPhoto = ImageTk.PhotoImage(buttonImage) 

btnServiceIo = ttk.Button(
    root,
    text="Usługa automatyczna",
    image=buttonPhoto,
    compound=tk.LEFT,
    width=30)
btnServiceIo.pack(side=tk.LEFT)

root.mainloop()

Result

0 голосов
/ 14 марта 2019

Ответ от @fhdrsdg был почти идеальным, но он перепутался с некоторыми моими простыми кнопками только с текстом, по центру кнопки.Я должен был сделать выделенный стиль для моей кнопки следующим образом:

# Access ttk style object
s = ttk.Style()

# Set dedicated style for button, derived from main button class
s.configure('service-io.TButton', anchor=tk.W)

self.ioBtnImg_off = tk.PhotoImage(file='../img/io.png')
self.ioBtnImg_on = tk.PhotoImage(file='../img/io_on.png')
self.btnServiceIo = ttk.Button(
    top_buttons_frame,
    text="Usługa automatyczna",
    image=self.ioBtnImg_off,
    compound=tk.LEFT,
    width=30,
    style='service-io.TButton' # use dedicated style
    )
...