Кнопка Tkinter не определена, поскольку присутствует внутри функции - PullRequest
0 голосов
/ 05 января 2019

Что я пытаюсь сделать:

Я хочу, чтобы кнопка Confirmar исчезла при нажатии, для этого я перенаправил ее на функцию dConfirm, которая должна запускать процесс уничтожения.

Что происходит:

Кнопка определена в функции, отличной от процесса уничтожения, поэтому она возвращает не определенная ошибка .

Мой код:

def dSim():
    btn3=Button(janela, text= "Hipertensao arterial", command = add1) 
    btn3.place(x = 80, y = 219)
    btn4=Button(janela, text= "Pedras nos rins", command = add2) 
    btn4.place(x = 200, y = 219)
    btn5=Button(janela, text= "Osteoporose", command = add3) 
    btn5.place(x = 295, y = 219)
    btn6=Button(janela, text= "Colesterol elevado", command = add4) 
    btn6.place(x = 378, y = 219)
    btn7=Button(janela, text= "Esclerose multipla", command = add5) 
    btn7.place(x = 492, y = 219)
    btn.destroy()
    btn2.destroy()
    lb7=Label(janela, text= "Selecione as suas doencas:", font = ("Verdana", "14"))
    lb7.place(x = 185, y = 190)
    btn8=Button(janela, text= "Confirmar", command = dConfirm) 
    btn8.place(x = 80, y = 240)

def dNao():
    lb5=Label(janela, text=Gperf, font = ("Verdana", "14"))
    lb5.place(x = 80, y = 165)
    btn.destroy()
    btn2.destroy()
    lb6=Label(janela, text="E perfeitamente saudavel, otimo!", font = ("Verdana", "14"))
    lb6.place(x = 185, y = 190)

def dConfirm():
    btn8.destroy()

Ответы [ 2 ]

0 голосов
/ 05 января 2019

# 1 Вы можете попробовать это:

import tkinter as tk
root = tk.Tk()
frame = tk.Frame(root)
frame.grid(row=0, column=0, padx=4, pady=4)

# destroy the button on dConfirm function call
def dConfirm():
    btn8.destroy()

# Declare btn8 outside of the two function
btn8 = tk.Button(frame, text="Confirmar", command=dConfirm)

# Place btn8 inside the function you want
def dSim():
    btn8.grid(row=0, column=0, padx=4, pady=4)
dSim()
root.mainloop()

# 2 Вы также можете попробовать это (на мой взгляд, это лучше):

import tkinter as tk

class MainWindow:
    def __init__(self, master):
        self.master = master

        self.frame = tk.Frame(self.master)
        self.frame.grid(row=0, column=0, padx=4, pady=4)
        self.dSim()

    def dConfirm(self):
        self.btn8.destroy()

    def dSim(self):
        self.btn8 = tk.Button(self.frame, text="Confirmar", command=self.dConfirm)
        self.btn8.grid(row=0, column=0, padx=4, pady=4)

def main():
    root = tk.Tk()
    app = MainWindow(root)
    root.mainloop()

if __name__ == '__main__':
    main()
0 голосов
/ 05 января 2019

У вас есть три варианта:

  1. btn8 является локальной переменной, поэтому вы не можете ссылаться на нее вне ее области видимости. Вы можете сделать это global .

  2. Вместо прямого вызова dConfirm(), передайте ему экземпляр кнопки, используя lambda, например так: btn8 = Button(janela, text="Confirmar", command=lambda: dConfirm(btn8)) и измените определение функции на def dConfirm(btn8): (я бы предпочел это, если вы не хотите переходить к варианту 3 и изменить свой код)

  3. Если вы используете классы, сделайте его экземпляром класса с помощью self.btn8, а затем уничтожьте его с помощью self.btn8.destroy().

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