Создание маркированного списка на виджете метки с помощью Python tkinter

1

Есть ли способ создать висячий отступы, используя виджет метки tkinter? Примечание: Использование стандартных пульпе не должно быть * или -.

  • 0
    Посмотрите на это . Он использует текстовый виджет вместо метки для большей гибкости. Я бы посоветовал использовать u2022 качестве u2022 вместо u00B7 . Если вы не хотите разрешать редактирование, добавьте txt.configure(state=DISABLED) .
  • 0
    @fhdrsdg Это здорово, спасибо, не понимал, что можно отключить редактирование.
Теги:
tkinter

3 ответа

1
Лучший ответ

вы можете использовать кодовые точки Юникода в качестве приблизительной реализации:

try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk

class BulletLabel(tk.Label):
    def __init__(self, master, *args, **kwargs):
        text = kwargs.pop('text', '')
        kwargs['text'] = self.bulletise(text)
        tk.Label.__init__(self, master, *args, **kwargs)

    def bulletise(self, text):
        if len(text) == 0: # no text so no bullets
            return ''
        lines = text.split('\n')
        parts = []
        for line in lines: # for each line
            parts.extend(['\u2022', line, '\n']) # prepend bullet and re append newline removed by split
        return ''.join(parts)

    def configure(self, *args, **kwargs):
        text = kwargs.pop('text', '')
        if text != '':
            kwargs['text'] = self.bulletise(text)
        tk.Label.configure(*args, **kwargs)


root = tk.Tk()

blabel = BulletLabel(root, text='one\ntwo\nthree')
blabel.pack()

root.mainloop()
  • 0
    Это здорово спасибо
2

Я сделал класс, который делает то, что вы хотите:

class BLabel(object):
    b = "•"
    def __init__(self,master):
        import tkinter as tk
        self.l = tk.Label(master)
    def add_option(self,text):
        if self.l.cget("text") == "":
            self.l.config(text=self.b+" "+text)
        else:
            self.l.config(text=self.l.cget("text") +"\n"+ self.b + " "+text)

Вы можете использовать его так:

lbal = BLabel(master=master)    
lbal.add_option("Bullet1")    #<-- adding item
lbal.add_option("Bullet2")    #<-- adding item
lbal.l.pack()     #<-- Packing

Вот пример кода:

import tkinter as tk

root = tk.Tk()

class BLabel(object):
    b = "•"
    def __init__(self,master):
        import tkinter as tk
        self.l = tk.Label(master)
    def add_option(self,text):
        if self.l.cget("text") == "":
            self.l.config(text=self.b+" "+text)
        else:
            self.l.config(text=self.l.cget("text") +"\n"+ self.b + " "+text)



lbal = BLabel(master=root)
lbal.add_option("Bullet1")
lbal.add_option("Bullet2")
lbal.l.pack()        

Вот вывод вышеприведенного кода:

Изображение 174551

Таким образом, вы можете использовать pack, place или grid. Пример:

Сетка:

lbal.l.grid(row=0,column=0)

Место:

lbal.l.place(x=0,y=0)

Упаковка:

lbal.l.pack()
0

Вам будет лучше с помощью виджета сообщений, который представляет собой виджет ярлыка, предназначенный для отображения текста с несколькими строками. Для ваших пуль вы можете использовать строку юникода. Например:

import tkinter as tk

root = tk.Tk()

point = '\u2022'
msg = tk.Message(root, text='Hello\n%s World.' % point)
msg.pack()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню