Как изменить текст всплывающих подсказок tkinter, а не плавать друг над другом?

def show_info_for_test(self, chosen_test):
        if chosen_test == "00.NA":
            ToolTip(self.expected_val,msg = "No test has been chosen")
        elif chosen_test == "01.Min":
            ToolTip(self.expected_val, msg = "Fail if real minimum smaller")
        elif chosen_test == "02.Max":
            ToolTip(self.expected_val, msg = "Fail if real max larger")
        elif chosen_test == "03.Min-Max":
            ToolTip(self.expected_val, msg = "Fail if not in range")

Как вы можете видеть, «Сбой, если не в диапазоне» находится поверх сообщения «Сбой, если реальный минимум меньше». Сообщения должны меняться в зависимости от того, что я выбираю в третьем поле со списком. Я думаю, это потому, что я, вероятно, создаю новые всплывающие подсказки каждый раз, когда выбираю что-то из списка. Есть ли способ изменить текст всплывающей подсказки вместо создания новых?

Вы используете модуль tkinter-tooltip?

acw1668 06.12.2022 14:36

@acw1668 да, я

evgeny 06.12.2022 14:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не должны создавать новый экземпляр ToolTip всякий раз, когда вызывается show_info_for_test(). Вы должны создать экземпляр ToolTip один раз и обновить сообщение всплывающей подсказки с помощью обратного вызова, переданного опцией msgToolTip().

Ниже приведен пример, основанный на вашем коде:

import tkinter as tk
from tktooltip import ToolTip

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.expected_val = tk.Label(self, text = "Hello")
        self.expected_val.pack(padx=100, pady=100)

        # initial tooltip message
        self.msg = "Hello" 
        # create the ToolTip() once
        self.tooltip = ToolTip(self.expected_val, msg=self.get_msg)

        # use keys to change the tooltip message
        self.bind("1", lambda e: self.show_info_for_test("00.NA"))
        self.bind("2", lambda e: self.show_info_for_test("01.Min"))
        self.bind("3", lambda e: self.show_info_for_test("02.Max"))
        self.bind("4", lambda e: self.show_info_for_test("03.Min-Max"))

    # function used to return the tooltip message
    def get_msg(self):
        return self.msg

    def show_info_for_test(self, chosen_test):
        if chosen_test == "00.NA":
            self.msg = "No test has been chosen"
        elif chosen_test == "01.Min":
            self.msg = "Fail if real minimum smaller"
        elif chosen_test == "02.Max":
            self.msg = "Fail if real max larger"
        elif chosen_test == "03.Min-Max":
            self.msg = "Fail if not in range"

App().mainloop()

Затем вы можете нажать «1», «2», «3» или «4», чтобы изменить сообщение всплывающей подсказки.

Вы можете применить логику к своему приложению.


Обновлено: пример использования поля со списком для изменения всплывающей подсказки:

import tkinter as tk
from tkinter import ttk
from tktooltip import ToolTip

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.config(padx=100, pady=100)

        # initial tooltip message
        self.msg = "Hello"

        options = ("00.NA", "01.Min", "02.Max", "03.Min-Max")
        self.combo = ttk.Combobox(self, values=options, state = "readonly")
        self.combo.pack(side = "left")
        self.combo.bind("<<ComboboxSelected>>", lambda e: self.show_info_for_test(self.combo.get()))

        self.expected_val = ttk.Entry(self, width=20)
        self.expected_val.pack(side = "left")

        self.tooltip = ToolTip(self.expected_val, msg=self.get_msg, delay=0.01)

    # function used to return the tooltip message
    def get_msg(self):
        return self.msg

    def show_info_for_test(self, chosen_test):
        if chosen_test == "00.NA":
            self.msg = "No test has been chosen"
        elif chosen_test == "01.Min":
            self.msg = "Fail if real minimum smaller"
        elif chosen_test == "02.Max":
            self.msg = "Fail if real max larger"
        elif chosen_test == "03.Min-Max":
            self.msg = "Fail if not in range"

App().mainloop()

зачем тебе 1 2 3 4 ?

evgeny 07.12.2022 10:12

И когда вы делаете привязку, вы имеете в виду self.tooltip.bind?

evgeny 07.12.2022 10:19

@evgeny Поскольку вы не предоставляете минимальный воспроизводимый пример, я просто создаю свою тестовую программу и использую клавиши с «1» по «4», чтобы изменить сообщение всплывающей подсказки. Привязка находится на корневом окне, поэтому нужно сделать корневое окно активным и нажать клавиши для проверки.

acw1668 07.12.2022 11:07

Большое спасибо. Это все еще не работает для меня. Я буду пытаться.

evgeny 07.12.2022 12:26

Что вы имеете в виду под "все еще не работает"? Меня устраивает.

acw1668 07.12.2022 12:28

Я хочу привязать всплывающую подсказку к опции, выбранной из поля со списком. Всплывающая подсказка должна отображаться поверх записи, которая называется «expected_val». Я не понял, кого я должен связать с кем? Извините, что я не понял вашего объяснения.

evgeny 08.12.2022 10:14

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

acw1668 08.12.2022 11:27

Теперь я понял, почему это не сработало для меня. Я написал обратный вызов get_msg с такими скобками: self.tooltip = ToolTip(self.expected_val, msg=self.get_msg()) Теперь все работает, большое спасибо!

evgeny 12.12.2022 08:51

Другие вопросы по теме