Как использовать событие в другом файле? - PullRequest
0 голосов
/ 30 марта 2020

Я подготовил два файла. Сначала с GUI классом. Второй файл - это скрипт, в котором я хочу использовать классы GUI, Базы данных и Шаблоны. А Базы данных и Шаблоны классов работают. Я проверяю это в других сценариях.

Вопросы: Как я могу использовать форму события (KeyRelase) GUI class в скрипте?

Первый:

from tkinter import *
from tkinter.font import Font
from tkinter.ttk import Separator


class GUI:

def __init__(self, master):
    self.ent_InventoryNumber = Entry(self.frm_FirstColumn, font=fontStyle, width=35, borderwidth=2, justify=CENTER)
    self.ent_InventoryNumber.insert(END, "Wprowadź TUTAJ numer inwentarzowy")
    self.ent_InventoryNumber.grid(row=2, column=0, columnspan=2, padx=5, pady=20, ipadx=2, ipady=2)
    self.ent_InventoryNumber.bind("<KeyRelease>", lambda x: self.searchChamber())


def searchChamber(self):
   return self.ent_InventoryNumber.get()

Второй файл со скриптом:

import Databases as Db
import Template
from GUI import GUI

def test(a):
   print(a)

window = Tk()
myGUI = GUI(window)
window.mainloop()
# test(myGUI.searchChamber()) ???

1 Ответ

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

bind правильно работает в вашем коде. Проблема в том, что bind не может получить значение, которое вы используете с return - оно не может присвоить его какой-либо переменной, и вы должны использовать это значение непосредственно в searchChamber или присвоить какой-либо переменной, чтобы использовать ее позже.

Другая проблема: когда вы закрываете окно, tkinter уничтожает все виджеты, и вам нужно сохранить значение от Entry в некоторой переменной

    def searchChamber(self):
        self.result = self.ent_InventoryNumber.get()

и позже получить эту переменную

    test(GUI.result)

В этом примере я использую print(), чтобы увидеть, выполняет ли bind функцию после каждого нажатия клавиши. Я также использую переменную класса self.result, чтобы сохранить значение и использовать его после закрытия окна.

GUI .py

import tkinter as tk

class GUI:

    def __init__(self, master):
        self.result = '' # default value as start

        self.ent_InventoryNumber = tk.Entry(master)
        self.ent_InventoryNumber.insert('end', "Wprowadź TUTAJ numer inwentarzowy")
        self.ent_InventoryNumber.grid(row=2, column=0)
        self.ent_InventoryNumber.bind("<KeyRelease>", self.searchChamber)

    def searchChamber(self, event=None):
        self.result = self.ent_InventoryNumber.get()

        print('[DEBUG] searchChamber:', self.result)

main.py

import tkinter as tk
from GUI import GUI

window = tk.Tk()
myGUI = GUI(window)
window.mainloop()
print('result:', myGUI.result)
...