为什么按钮在我的代码中保持按下状态?

时间:2020-04-12 14:13:46

标签: python tkinter

我真的知道为什么按住mi键,问题更像是:如何避免呢?源代码如下,谢谢:

import tkinter as tk
from tkinter import filedialog as fd


# creacion de cada venta


# ---ventana 1---
class Window1(tk.Frame):
    final_path = ""

    def __init__(self, parent):
        # inicio y creacion del propio frame
        tk.Frame.__init__(self, parent)
        self.config(bg="#33ccff", width='990', height='250')
        # primera etiqueta con valores
        self.label1 = tk.Label(
        self, text="Documento Seleccionado", bg="#33ccff")
        # segunda etiqueta con texto variable
        self.txt_carga = tk.StringVar()
        self.txt_carga.set("Archivo no seleccionado")
        self.label2 = tk.Label(self, textvariab=self.txt_carga, bg="#33ccff")

        # primer boton de carga de documentos y funcion del boton
        self.load_button = tk.Button(self, text="Cargar Documento")

        # segundo boton de siguiente
        self.next_button = tk.Button(self, text="Siguiente")

        # Definicion de funciones (Con binding hay que añadir el evento al boton)
        def function_load(event):
            path = fd.askopenfile(filetype=(("Excel", ".xlsx"), ("CSV", ".csv"), ("Todos los Archivos", "*.*")))

            self.final_path = str(path.name)
            self.txt_carga.set(path.name)

        def function_next(event):
            print(self.final_path)

        # binding: de esta manera se llama a las funciones de los botones al final de forma
        # que queda mas ordenado, (x,y) -> x = tipo de evento, y = funcion donde se define
        self.load_button.bind('<ButtonPress-1>', function_load)
        self.next_button.bind('<Button-1>', function_next)
        # instanciacion de los objetos en la ventana
        self.label1.grid(row=0, column=0, columnspan=2, padx=200, pady=25)
        self.label2.grid(row=1, column=0, columnspan=2, pady=25)
        self.load_button.grid(row=2, column=0, pady=20)
        self.next_button.grid(row=2, column=1, pady=20)

# ---ventana inicio------


class MainWindow(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        self.parent = parent
        # necesario para que este se inicie como objeto de la clase Frame
        tk.Frame.__init__(self, parent, *args, **kwargs)

        # INSANCIAS
        self.window1 = Window1(self)  # instancia de la clase

        self.window1.pack()  # empaquetado de la clase

        self.pack()  # empaquetado propio


# creo el main del programa
if __name__ == "__main__":
    root = tk.Tk()
    MainWindow(root)
    root.mainloop()

如您所见,我的程序有一个窗口,其中放置了几个标签和几个按钮。问题是由分配给load_button(def function_load)的函数引起的,因为打开了文件对话框,但是我想进程一直在运行,导致按钮保持按下状态。

1 个答案:

答案 0 :(得分:2)

如果您想在按下按钮小部件时执行某些操作,则无需为按钮小部件绑定事件,只需为其设置命令。代码中就会出现拼写错误。您的最终代码:

import tkinter as tk
from tkinter import filedialog as fd


# creacion de cada venta


# ---ventana 1---
class Window1(tk.Frame):
    final_path = ""

    def __init__(self, parent):

        # inicio y creacion del propio frame
        tk.Frame.__init__(self, parent)
        self.config(bg="#33ccff", width='990', height='250')
        # primera etiqueta con valores
        self.label1 = tk.Label(
        self, text="Documento Seleccionado", bg="#33ccff")
        # segunda etiqueta con texto variable
        self.txt_carga = tk.StringVar()
        self.txt_carga.set("Archivo no seleccionado")
        self.label2 = tk.Label(self, textvariable=self.txt_carga, bg="#33ccff") # spelling error.

        # primer boton de carga de documentos y funcion del boton
        self.load_button = tk.Button(self, text="Cargar Documento",command=self.function_load) # add command 

        # segundo boton de siguiente
        self.next_button = tk.Button(self, text="Siguiente",command=self.function_next) # add command 

        # Definicion de funciones (Con binding hay que añadir el evento al boton)

        # binding: de esta manera se llama a las funciones de los botones al final de forma
        # que queda mas ordenado, (x,y) -> x = tipo de evento, y = funcion donde se define
        # instanciacion de los objetos en la ventana
        self.label1.grid(row=0, column=0, columnspan=2, padx=200, pady=25)
        self.label2.grid(row=1, column=0, columnspan=2, pady=25)
        self.load_button.grid(row=2, column=0, pady=20)
        self.next_button.grid(row=2, column=1, pady=20)

    def function_load(self): # it can be a self.function
        path = fd.askopenfilename(filetype=(("Excel", ".xlsx"), ("CSV", ".csv"), ("Todos los Archivos", "*.*")))

        self.txt_carga.set(path)

    def function_next(self):
        print(self.final_path)
# ---ventana inicio------


class MainWindow(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        self.parent = parent
        # necesario para que este se inicie como objeto de la clase Frame
        tk.Frame.__init__(self, parent, *args, **kwargs)

        # INSANCIAS
        self.window1 = Window1(self)  # instancia de la clase

        self.window1.pack()  # empaquetado de la clase

        self.pack()  # empaquetado propio


# creo el main del programa
if __name__ == "__main__":
    root = tk.Tk()
    MainWindow(root)
    root.mainloop()