Как украсить текстовый виджет Tkinter - PullRequest
0 голосов
/ 24 марта 2020

Как мне оформить простое текстовое поле на Tkinter, чтобы оно стало похоже на панель поиска Google: enter image description here

Можно ли вставить какое-нибудь изображение в текстовый виджет? Можно ли установить текст по умолчанию: «Поиск в Интернете», тогда, когда пользователь начнет вводить текст в виджет, текст по умолчанию «Поиск в Интернете» исчезнет, ​​чтобы показать наш текст?

I пробовал:

textBox = Text(root)
text.insert("END", "Search the Web")

Но в результате мне нужно сначала удалить «Поиск в Интернете», прежде чем набирать текстовый виджет, а это не то, что мне нужно.

1 Ответ

2 голосов
/ 24 марта 2020

Вам необходимо привязать <FocusIn> к обратному вызову, а затем в обратном вызове удалить заполнитель, если он существует.

Также привязать <FocusOut> к другому обратному вызову и вставить обратно заполнитель, если текущее содержимое текста поле пусто.

Ниже приведен пример:

import tkinter as tk

class Textbox(tk.Text):
    # create the google image
    tkimg = None

    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        if self.tkimg is None:
            self.tkimg = tk.PhotoImage(file='images/google16x16.png')
        self.insert_placeholder()
        self.bind('<FocusIn>', self.on_focus_in)
        self.bind('<FocusOut>', self.on_focus_out)

    def insert_placeholder(self):
        ''' insert the placeholder into text box '''
        lbl = tk.Label(self, text='Search the Web', image=self.tkimg, compound='left',
                       fg='darkgray', bg=self.cget('bg'), font=(None,10,'bold'))
        self.window_create('end', window=lbl)
        self.placeholder = self.window_names()[0]

    def on_focus_in(self, event):
        try:
            # check whether the placeholder exists
            item = self.window_cget(1.0, 'window')
            if item == self.placeholder:
                # remove the placeholder
                self.delete(1.0, 'end')
        except:
            # placeholder not found, do nothing
            pass

    def on_focus_out(self, event):
        if self.get(1.0, 'end-1c') == '':
            # nothing input, so add back the placeholder
            self.insert_placeholder()

root = tk.Tk()

Textbox(root, height=10).pack()
Textbox(root, height=5).pack()

root.mainloop()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...