Python tkinter отключить кнопку «отправить», пока все поля не будут заполнены - PullRequest
1 голос
/ 30 марта 2019

Я все еще относительно новичок в Python, но я делаю приложение с графическим интерфейсом пользователя, которое имеет 2 поля ввода и две кнопки filedialog, чтобы пользователь мог выбрать файл для импорта и каталог для сохранения вывода программы. Я пытаюсь выполнить некоторую проверку полей ввода, чтобы убедиться, что пользователь не может нажать кнопку отправки, пока поля ввода не будут заполнены, и они не выбрали файл для импорта и каталог для сохранения вывода.

Я кое-что понял, но застрял и боюсь, что недостаточно разбираюсь в классах и методах, чтобы определить, почему я не могу изменить состояние моего submit_button.config?

Я прочитал различные примеры того, как выполнить проверку полей ввода, включая использование команды validate и создание метода validate в моем классе. Я отказался от этого, потому что не мог понять, как проверить несколько полей в команде submit_button.

Вот мой код, как он сейчас сидит. Я борюсь с методом validate в классе Application.

import pandas as pd
import numpy as np
from tkinter import *
from tkinter import ttk
from tkinter import filedialog as fd
from tkinter import messagebox
import os

class FileLogic:

    def __init__(self, path, save_location, request_id, exeuction_id):
        self.path = path
        self.save_location = save_location
        self.request_id = request_id
        self.execution_id = execution_id

    def fileopen(self=None):
        global fileName
        global path
        path = fd.askopenfilename(title = "Select File", filetypes=( ("Excel files", "*.xlsx"),("All files", "*.*") ) )
        fileName = os.path.split(path)[1]

        if not fileName:
            messagebox.showerror("ERROR - File Not Selected", "A file was not selected to process.  Please select a file by double-clicking or select file and press Open button")
        else:
            file_select_label = Label(root, text=("File Selected: " + fileName), width=75, bg="light blue")
            file_select_label.grid(row=7, columnspan=2)

        return path

    def filesave(self=None):
        global save_location
        save_location = fd.askdirectory(title = "Select Directory")

        if not save_location:
            messagebox.showerror("ERROR - Directory Not Selected", "This upload process will build an output file.  Please select a folder where the output file can be saved")
        else:
            file_select_label = Label(root, text=("Output file will be saved: " + save_location), width=75, bg="light blue")
            file_select_label.grid(row=8, columnspan=2)

        return save_location

    def submit(self, path, save_location, request_id, execution_id):

        print("FileLogic path: " + self.path)
        print("FileLogic save: " + self.save_location)
        print("FileLogic request: " + self.request_id)
        print("FileLogic execution: " + self.execution_id)
#        FileParsing.__init__(request_id)

class FileParsing:

    def __init__(self, request_id):
        self.request_id = request_id
#        self.execution_id_entry = execution_id_entry
        print("request id2: " + request_id)

class Application(Frame):

    def __init__(self, master):
        ttk.Frame.__init__(self, master)

        self.grid()
        self.create_widgets()


    def create_widgets(self):
        global submit_button
        ##### Define the Labels ###############
        self.request_id_label = Label(root, text="Enter Rebate Request Id:", bg="light blue", bd=2, width=25).grid(row=0, column=0)
        self.execution_id_label = Label(root, text="Enter Rebate Execution Id:", bg="light blue", bd=2, width=25).grid(row=1, column=0)
        self.blank_label = Label(root, bg="light blue")
        ####### Define the Entry fields ##################


        self.request_id_entry = Entry(root,bg="light gray", bd=2, width=25, textvariable=request_id_entry).grid(row=0, column=1)
        self.execution_id_entry = Entry(root, bg="light gray", bd=2, width=25, textvariable=execution_id_entry).grid(row=1, column=1)

        ###### Define the Buttons ###############
        self.submit_button = Button(root, text="Submit", bg="gray", width=17, command= lambda: self.submit_click(path, save_location, request_id, execution_id))
        self.submit_button.config(state='disabled')

        self.open_file_button = Button(root, text="Select file to process", width = 30, command=FileLogic.fileopen).grid(row=3, column=0)
        self.save_location_button = Button(root, text="Select location to save output", width=30, command=FileLogic.filesave).grid(row=4, column=0)

        ##### Build the Grid ##################
        self.blank_label.grid(row=2, column=0)
        self.blank_label.grid(row=5, columnspan=2)
        self.submit_button.grid(row=6, column=1)

    def validate(self, *args):
        print("validate")
        button_status = self.create_widgets(submit_button)

        if request_id_entry.get():
            print("normal")
            print(button_status)
#            self.submit_button.config(state='normal')
        else:
            print("diabled")
            print(submit_button.config)
#            self.submit_button.config(state='disabled')

    def num_check(self,var):
        var = self.var.get()
        print(var)
        if var.isnumeric():
            return True
        else:
            tkinter.messagebox.showinfo("Error", "Enter Numeric Value")

    def submit_click(self, path, save_location, request_id, execution_id):
        self.request_id = request_id_entry.get()
        self.execution_id = execution_id_entry.get()

        a = FileLogic(path, save_location, request_id, execution_id)
        FileLogic.submit(a, path, save_location, request_id, execution_id)


root=Tk()

root.title("Rebate Bid Data Upload")
root.geometry("500x200")
root.configure(background="light blue")
request_id_entry = StringVar()
execution_id_entry = StringVar()

request_id_entry.trace("w", Application.validate)

app = Application(root)
root.mainloop()

Я пытаюсь получить, где кнопка отправки отключена, пока все элементы ввода и атрибуты filedialog не будут завершены. Затем для полей ввода я проверяю, чтобы они были числовыми, и я хочу убедиться, что они целые числа.

1 Ответ

0 голосов
/ 30 марта 2019

Вы не используете textvariable правильно. Также обратите внимание, что вы не сохраняете ссылку на свои entry виджеты, определяя их и вызывая метод grid в той же строке.

def create_widgets(self):
    #global submit_button #you don't have to declare global here: submit_button is already an attribute

    ...

    self.request_var = StringVar() #create StringVars for request
    self.execution_var = StringVar() #ditto for execution
    self.request_id_entry = Entry(root,bg="light gray", bd=2, width=25,textvariable=self.request_var).grid(row=0, column=1) #set the textvariable to the StringVar
    self.execution_id_entry = Entry(root, bg="light gray", bd=2, width=25,textvariable=self.execution_var).grid(row=1, column=1)
    self.request_var.trace("w",self.validate) #trace changes on StringVar
    self.execution_var.trace("w",self.validate)

    ...

def validate(self, *args):
    if self.request_var.get() and self.execution_var.get(): #if both StringVars has content
        print("normal")
        self.submit_button.config(state='normal')
    else:
        print("disabled")
        self.submit_button.config(state='disabled')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...