Как использовать If-Statement внутри команды кнопки tkinter, чтобы проверить, является ли кнопка tkinter CheckButton нажатой или нет? - PullRequest
0 голосов
/ 29 апреля 2019

Краткое содержание программы

Я делаю программу обработки текста на основе Python. Здесь я использую следующие виджеты Tkinter со следующими именами для его GUI:

  1. Текстовый виджет> "text_input"
  2. Текстовый виджет> "text_output"
  3. Виджет CheckButton> "checkButton_tense"
  4. Виджет кнопок> "button_analyse"

И теперь я хотел, чтобы моя программа работала в следующей последовательности.

  1. Получение текста из "text_input".
  2. Выполните некоторую базовую обработку текста в каком-то другом классе, щелкнув «button_analyse» и покажите вывод в «text_output».
  3. Но если щелкнуть / проверить виджет "checkButton_tense". Затем он должен также выполнять проверку времени вместе с основной обработкой текста, иначе он должен выполнять только базовую обработку текста.
  4. Над операцией №. 3 следует выполнить после проверки состояния виджета «checkButton_tense» при нажатии кнопки «button_analyse» и показать вывод в «text_output»

Проблема / ошибка

Теперь, когда я использую оператор if внутри виджета "command = lambda:" моего виджета кнопки Tkinter "button_analyse", чтобы проверить состояние "checkButton_tense", он выдает ошибку. Я пытался сделать это многими способами, но это не работает.

Я пробовал упомянутое решение здесь . Но когда я попробовал какое-либо решение, подобное этому, я не смог показать свой текст в виджете "text_output", потому что он внутри другого метода python "main_gui_layout". Я также пробовал много других решений, приведенных здесь, при переполнении стека, но не нашел ничего идентичного Пожалуйста, направьте меня в контексте вышеупомянутой проблемы и следующего кода.

Код

from tkinter import *
from Examples import Examples
from TextAnalysis import PerformTextAnalysis


class MyGui:
    useExamples = Examples()
    performTextAnalysis = PerformTextAnalysis()

def __init__(self, master):
    self.main_gui_layout(master)

def main_gui_layout(self, master):

    # InputBox to get the input Text.

    text_input = Text(master, bd=1, height=15, width=100)
    text_input.insert('end', self.useExamples.example2)
    text_input.pack(side=TOP)

    # OutputBox to show the processed Text.

    text_output = Text(master, bd=1, height=15, width=100)
    text_output.pack(side=TOP)

    # CheckButton: it will perform tense analysis if checked/clicked

    tenseCheck_clicked = IntVar()
    checkButton_tense = Checkbutton(master, text="Tense Inspection", variable=tenseCheck_clicked,
                                    bg='#9aa7bc')
    checkButton_tense.var = tenseCheck_clicked
    checkButton_tense.pack(side=TOP)

    # Analysis Button: it will process text and show in output.
    # It will also perform Tense Analysis if Above "checkButton_tense" is check/active.

    button_analyse = Button(master, text="Analyse Requirements", width=20,
                            command=lambda:
                            [
                                self.performTextAnalysis.get_userReqiurement(
                                str(text_input.get('1.0', 'end'))),
                                if tenseCheck_clicked == 1:
                                    ans = self.performTextAnalysis.performBasicAnalysis(),
                                    self.performTextAnalysis.performTenseAnalysis(),
                                    text_output.insert(END, ans)
                                else:
                                self.performTextAnalysis.performBasicAnalysis()

                            ])
    button_analyse.pack(side=TOP)

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

Вы не должны помещать такую ​​логику в lambda. Способ работы tkinter заключается в том, что кнопка должна вызывать функцию. Тогда становится просто добавлять любую логику, какую вы хотите.

Вам просто нужно идентифицировать любые виджеты, к которым необходимо получить доступ в этой функции, и сделать их свойствами класса.

В вашем случае это будет выглядеть примерно так:

class MyGui:
    useExamples = Examples()
    performTextAnalysis = PerformTextAnalysis()

    def main_gui_layout(self, master):
        ...
        self.text_input = Text(master, bd=1, height=15, width=100)
        ....
        self.tenseCheck_clicked = IntVar()
        ...
        button_analyse = Button(master, text="Analyse Requirements", width=20,
                            command=self.on_button_click)

    def on_button_click(self, event):
        data = self.text_input.get('1.0', 'end')
        self.performTextAnalysis.get_userReqiurement(data)
        if self.tenseCheck_clicked == 1:
            ans = self.performTextAnalysis.performBasicAnalysis()
            self.performTextAnalysis.performTenseAnalysis()
            self.text_output.insert(END, ans)
        else:
            self.performTextAnalysis.performBasicAnalysis()
1 голос
/ 29 апреля 2019

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

У вас было несколько вещей, которые я бы изменил, например, ваш класс.Ваш класс сложнее, чем нужно, поэтому давайте удалим метод main_gui_layout и просто создадим графический интерфейс в методе init.Тем не менее, мы также можем наследовать от класса Tk(), поэтому мы можем использовать self для контейнера виджетов и атрибутов класса.

Также я бы изменил ваш импорт tkinter на import tkinter as tk, так как это поможетпредотвратить случайную перезапись импорта.

См. пример ниже и дайте мне знать, если у вас есть какие-либо вопросы.

import tkinter as tk
from Examples import Examples
from TextAnalysis import PerformTextAnalysis


class MyGui(tk.Tk):
    def __init__(self):
        super().__init__()
        self.useExamples = Examples()
        self.performTextAnalysis = PerformTextAnalysis()

        self.text_input = tk.Text(self, bd=1, height=15, width=100)
        self.text_input.insert('end', "self.useExamples.example2")
        self.text_input.pack(side='top')

        self.text_output = tk.Text(self, bd=1, height=15, width=100)
        self.text_output.pack(side='top')
        self.tenseCheck_clicked = tk.IntVar()

        checkButton_tense = tk.Checkbutton(self, text="Tense Inspection", variable=self.tenseCheck_clicked, bg='#9aa7bc')
        checkButton_tense.var = self.tenseCheck_clicked
        checkButton_tense.pack(side='top')
        tk.Button(self, text="Analyse Requirements", width=20, command=self.new_function).pack(side='top')

    def new_function(self):
        self.performTextAnalysis.get_userReqiurement(str(self.text_input.get('1.0', 'end')))
        if self.tenseCheck_clicked == 1:
            ans = self.performTextAnalysis.performBasicAnalysis()
            self.performTextAnalysis.performTenseAnalysis()
            self.text_output.insert('end', ans)
        else:
            self.performTextAnalysis.performBasicAnalysis()

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