Как я могу получить результат из диалогового окна TK, чтобы вернуть значение обратно в форму? - PullRequest
0 голосов
/ 08 апреля 2019

Возникли проблемы при попытке заполнить виджет формы tk

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

Я новичок в Python.У меня есть программа Python3 для выполнения некоторых задач в файле Excel.Программа использует три файла.Все, что мне нужно, это простой интерфейс, который позволяет пользователю выбрать файл сценария (файл1), файл процедур (файл2), и будет третий выходной файл.Затем используйте эти файлы для основной обработки.

Я скопировал код с некоторых веб-сайтов и исказил некоторые вместе, чтобы что-то придумать (см. Ниже).Тем не менее, я не могу понять, как я должен записать код обратно в текстовый виджет.

например, я бы ожидал что-то в виде Window.t_out = "new value" или self.t_out = "новое значение "

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

Известные проблемы: 1. У меня есть .grid и .place, и я не собираюсь смешивать их, но просто пытаюсьчтобы увидеть, что лучше 2. Я не совсем уверен на данный момент, если я должен оставить функции кнопок с классом или вне класса, так как оба, кажется, работают.


class Window(Frame):

    def __init__(self, master=None):
        # parameters that you want to send through the Frame class.
        Frame.__init__(self, master)

        # reference to the master widget, which is the tk window
        self.master = master

        # with that, we want to then run init_window, which doesn't yet exist
        self.init_window()


    # Creation of init_window
    def init_window(self):

        self.master.title("Select Files to process")    # changing the title of our master widget
       # self.pack(fill=BOTH, expand=1)                  # allowing the widget to take the full space of the root window

        TROW = 1
        SROW = 2
        PROW = 4
        COL = 2
        COLBTN = 30

        # Define Menu

        menu = Menu(self.master)                        # creating a menu instance
        self.master.config(menu=menu)

        file = Menu(menu)                               # create the file Menu

        file.add_command(label="Exit",                  # adds a Exit to the menu option
                         command=self.menu_exit)        # bind client_exit to run on event

        menu.add_cascade(label="File", menu=file)       # bind the function file to Menu "File" Label

        edit = Menu(menu)                               # create the Edit Menu
        edit.add_command(label="Undo",
                         command=self.menu_undo)        # adds a command Undo to Edit menu

        menu.add_cascade(label="Edit", menu=edit)       # bind the function edit to Menu "Edit" Label

        # Define Form

        # Define the Labels

        Label(self.master, text="File1").grid(row=SROW)
        Label(self.master, text="File2").grid(row=PROW)

        # Define the Widgets

        t_out = Text(self.master,  height=15, width =100)
        t_scr = Text(self.master,  height =1, width =90)
        t_proc = Text(self.master,  height =1, width =90)
        t4 = Text(self.master,  height=10, width=20)

        # Define the positioning
        t_out.grid(row=TROW, column=COL)
        t_scr.grid(row=SROW, column=COL, sticky = W)
        t_proc.grid(row=PROW, column=COL, sticky = W)
        t4.place (x=50,y=320)


        # Assign the widgets to procedures
        Button(self.master, text='script',
               command=get_script_file).grid(row=SROW, column=COLBTN, sticky=W, pady=4)
        Button(self.master, text='procedure',
               command=get_procedure_file).grid(row=PROW, column=COLBTN, sticky=W, pady=4)
        Button(self.master, text='getVAL',
               command=self.getval).place(x=320,y=310)


    def getval(self):
        from tkinter import filedialog
        filename = filedialog.askopenfilename(initialdir="/", title="Select file",
                                                   filetypes=(("Excel Files", "*.xlsx"), ("all files", "*.*")))
         # I NEED TO WRITE BACK THE FILENAME INTO THE TEXT WIDGET HERE


    def menu_exit(self):
        exit()

    def menu_undo(self):
        print ("Undo not implemented yet")


def get_script_file():
    from tkinter import filedialog
    root.filename = filedialog.askopenfilename(initialdir="/", title="Select file",
                                               filetypes=(("Excel Files", "*.xlsx"), ("all files", "*.*")))
    print("got ", root.filename)
         # I NEED TO WRITE BACK THE FILENAME INTO THE TEXT WIDGET HERE ALSO

def get_procedure_file():
    print ("Not implemented yet")


# root window created. Here, that would be the only window, but
# you can later have windows within windows.
root = Tk()
root.geometry("1000x400")

# creation of an instance
app = Window(root)

# mainloop
root.mainloop()

1 Ответ

0 голосов
/ 08 апреля 2019

Вы должны использовать self., чтобы иметь доступ к виджету во всех методах класса.

self.t_out = Text(...)

Чтобы вставить новый текст в Text, вам нужно delete() старый текст и insert()новый

self.t_out.delete("0", "end")
self.t_out.insert("end", "new text")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...