Mehrere Schriftarten in einem Button

Fragen zu Tkinter.
Antworten
Axel_S
User
Beiträge: 6
Registriert: Freitag 9. Februar 2018, 08:19

Hi,

ich möchte gerne in der Beschriftung eines Buttons mehrere Schriftarten verwenden, um den aktuellen Schaltzustand anzuzeigen.

Code: Alles auswählen

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()

# Erstellen des Buttons mit fett formatiertem und normalem Text
button = ttk.Button(root, text="Fett, " + "Normal")
button.pack()

root.mainloop()
Trozt längerer Suche habe ich nichts gefunden, was funktioniert. Habt Ihr eine Idee?

Danke und Gruß,
Axel
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das geht denke ich nicht. Du musst dir dann einen eigenen Button mit Canvas bauen. Oder die GUI mit anderen Elementen aufbauen.
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ich weis nicht ob ich dich richtig verstanden habe, aber meinst du sowas(?):

Code: Alles auswählen

import tkinter as tk
import tkinter.font as font


class ButtonTest(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.normal_font = font.Font(family="Arial", size=12)
        self.bold_font = font.Font(family="Arial", size=20, weight="bold")
        self.button_state = False
        self.button = tk.Button(
            self, text="Drück mich", command=self.change_font, font=self.normal_font
        )
        self.button.grid(row=0, column=0)

    def change_font(self):
        if self.button_state:
            self.button.config(font=self.normal_font)
            self.button_state = False
        else:
            self.button.config(font=self.bold_font)
            self.button_state = True


def main():
    root = tk.Tk()
    root.title("Test")
    app = ButtonTest(root)
    app.pack()
    app.mainloop()


if __name__ == "__main__":
    main()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Er will verschiedene Schriftarten zugleich. Das geht nur mit Rich text Formaten oder sowas. Das kann Tkinter nicht.
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Ach dass der Button eine Beschriftung bekommt, die vielleicht so aussieht "An / Aus" und je nach dem wir das "An" oder das "Aus" dann fett dargestellt?
Na dann kann man mein Vorschlag wenigstens als Alternative im Hinterkopf behalten.

Viele Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo Axel_S,
ich vermute Du suchst sowas.

Code: Alles auswählen

import tkinter as tk
from tkinter import font
from functools import partial

def main():
    root = tk.Tk()
    schrift_1 = ('DAVIS', '12', 'bold')
    schrift_2 = ('C059', '16', 'normal', 'italic')
    taste = tk.Button(root, height=3, bd=5)
    zeile_1 = tk.Label(taste, height=1, text='abc', font=schrift_1, width=5,
                       relief='flat', fg='red')
    zeile_2 = tk.Label(taste, height=1, text='ABC', font=schrift_2, width=5,
                       relief='flat', fg='green')
    taste.config(command=partial(wechsle, zeile_1, zeile_2, schrift_1,
                                 schrift_2))
    zeile_1.bind('<Button-1>', partial(betaetigt, zeile_1, zeile_2, schrift_1,
                                 schrift_2, taste))
    zeile_2.bind('<Button-1>', partial(betaetigt, zeile_1, zeile_2, schrift_1,
                                 schrift_2, taste))
    zeile_1.bind('<ButtonRelease-1>', partial(losgelassen, taste))
    zeile_2.bind('<ButtonRelease-1>', partial(losgelassen, taste))
    taste.pack(fill='x')
    zeile_1.pack()
    zeile_2.pack()
    root.mainloop()

def wechsle(zeile_1, zeile_2, schrift_1, schrift_2):    
    if zeile_1['font'] == 'DAVIS 12 bold':
        zeile_1.config(font=schrift_2)
        zeile_2.config(font=schrift_1)
        zeile_1.config(fg='green')
        zeile_2.config(fg='red')
    else:
        zeile_1.config(font=schrift_1)
        zeile_2.config(font=schrift_2)
        zeile_2.config(fg='green')
        zeile_1.config(fg='red')

def losgelassen(taste, event):
    taste.config(relief='raised')

def betaetigt(zeile_1, zeile_2, schrift_1, schrift_2, taste, event):    
    wechsle(zeile_1, zeile_2, schrift_1, schrift_2)
    taste.config(relief='sunken')

if __name__ == '__main__':
    main()
Gruss Peter
Axel_S
User
Beiträge: 6
Registriert: Freitag 9. Februar 2018, 08:19

Hallo,

vielen lieben Dank für die vielen Antworten. Dewn letzten Code von Peter habe ich gerade ausprobiert und er macht genau das, was ich mir vorgestellt habe.Vielen Dank.
Ich werde ihn mir jetzt mal genauer ansehen und versuchen entsprechend umzusetzen.

Liebe Grüße,
Axel
Antworten