Я пытался разработать приложение, которое получало бы вводимые пользователем данные для подключения к базе данных. После подключения к базе данных приложение получает таблицу, созданную пользователем на основе некоторых параметров. Это было реализовано в рамках объектно-ориентированного подхода. Я создал два объекта этого экземпляра. Вот здесь и возникает проблема. Когда первое окно уничтожается, открывается второе окно, но оно не имеет никаких параметров стиля, используемых при рендеринге окна, которое я передал для создания экземпляра класса в части init класса. Я уже некоторое время пытаюсь его отладить. Но до сих пор не нашел основную причину. Вот код: -
Я добавил функциональность кнопкам с помощью виджета. bind(), а не Button(text="Something", команда=имя_функции). Судя по той отладке, которую я провел, кажется, что когда я использую функцию .bind(), то, если открывается окно верхнего уровня, привязка происходит снова. Но поскольку я явно связал функцию только один раз, другая привязка является произвольной, а функция, вызывающая функциюbind_on_fetch(), вызывается из определения __call__ основного цикла. Я не уверен, что здесь происходит.
Теперь, когда открывается окно верхнего уровня, а затем, когда я нажимаю кнопку «Готово», окно верхнего уровня, а также главное окно также уничтожаются. . Но один из виджетов инициирует событие, которое приводит к фоновой ошибке, не обрабатываемой библиотекой tkinter.
{'self': , 'func': , 'inspect': }
Called function print_args(self, func)
args: (, ) (tuple)
True
None
__call__
.!feedsinput.!frame7.!button
Number of active threads in on_fetch:1
{'self': , 'func': None, 'inspect': }
Called function print_args(self, func)
args: (, None) (tuple)
False
None
mainloop
Number of active threads in on_done before master_update:1
Number of active threads in on_done before destroy():1
bgerror failed to handle background error.
Original error: can't invoke "event" command: application has been destroyed
Error in bgerror: can't invoke "tk" command: application has been destroyed
Я пытался добавить некоторые функции журналирования, чтобы получить обратную связь о том, какая функция запускает эти вызовы событий, но мне не удалось определить, какая строка в файлах Python tkinter привела к этим триггерам событий. .
Я пытался разработать приложение, которое получало бы вводимые пользователем данные для подключения к базе данных. После подключения к базе данных приложение получает таблицу, созданную пользователем на основе некоторых параметров. Это было реализовано в рамках объектно-ориентированного подхода. Я создал два объекта этого экземпляра. Вот здесь и возникает проблема. Когда первое окно уничтожается, открывается второе окно, но оно не имеет никаких параметров стиля, используемых при рендеринге окна, которое я передал для создания экземпляра класса в части [b]init[/b] класса. Я уже некоторое время пытаюсь его отладить. Но до сих пор не нашел основную причину. [b]Вот код: -[/b] [code]import ttkbootstrap as ttkb from ttkbootstrap.constants import * from ttkbootstrap.tableview import Tableview import pyodbc from typing import * import pandas as pd import inspect import threading
def print_args(*args, **kwargs): """ Print the list of arguments and their types passed to a function. """ sig = inspect.signature(print_args) # Get the signature of the function. bound_args = sig.bind(*args, **kwargs) # Bind the arguments to the signature.
# Print the argument name, value, and type. for name, value in bound_args.arguments.items(): print(f"{name}: {value} ({type(value).__name__})")
def create_form_entry(master, widget: str, label: str, variable, fun=None): """Create a single form entry using a frame for each label""" container = ttkb.Frame(master) container.pack(fill=X, expand=YES, pady=5)
def get_table(self) -> List[str]: self.table_opt = [row.table_name for row in self.cursor.tables(catalog=self.database, tableType="TABLE", schema=self.username.upper())] return self.table_opt
def on_fetch(self, event=None): print(event.widget) print(f"Number of active threads in on_fetch:{threading.active_count()}") query = f"SELECT * FROM {self.feeds_input.table.get()}" rows = self.cursor.execute(query).fetchall() df = pd.DataFrame.from_records(rows, columns=[col[0] for col in self.cursor.description]) # print(df.to_string()) self.table_view = TableView(master=self.master, data=df) self.table_view.create_table(done_fun=self.on_done, cancel_fun=self.on_cancel) # create_table(master=self.master, data=df)
def on_done(self, event=None): self.master.unbind_all("") print(f"Number of active threads in on_done before master_update:{threading.active_count()}") self.master.update() self.table_view.update() print(f"Number of active threads in on_done before destroy():{threading.active_count()}") self.table_view.destroy() self.master.destroy()
if __name__ == '__main__': data1 = Model() data1.run()
data2 = Model() data2.run()
[/code] [b]Проблемы: -[/b] [list] [*]Я добавил функциональность кнопкам с помощью виджета. bind(), а не Button(text="Something", команда=имя_функции). Судя по той отладке, которую я провел, кажется, что когда я использую функцию .bind(), то, если открывается окно верхнего уровня, привязка происходит снова. Но поскольку я явно связал функцию только один раз, другая привязка является произвольной, а функция, вызывающая функциюbind_on_fetch(), вызывается из определения __call__ основного цикла. Я не уверен, что здесь происходит. [*]Теперь, когда открывается окно верхнего уровня, а затем, когда я нажимаю кнопку «Готово», окно верхнего уровня, а также главное окно также уничтожаются. . Но один из виджетов инициирует событие, которое приводит к фоновой ошибке, не обрабатываемой библиотекой tkinter. [/list] [b]Вывод для справки: -[/b] [code]{'self': , 'func': , 'inspect': } Called function print_args(self, func) args: (, ) (tuple) True
None __call__ .!feedsinput.!frame7.!button Number of active threads in on_fetch:1 {'self': , 'func': None, 'inspect': } Called function print_args(self, func) args: (, None) (tuple) False
None mainloop Number of active threads in on_done before master_update:1 Number of active threads in on_done before destroy():1 bgerror failed to handle background error. Original error: can't invoke "event" command: application has been destroyed Error in bgerror: can't invoke "tk" command: application has been destroyed
[/code] Я пытался добавить некоторые функции журналирования, чтобы получить обратную связь о том, какая функция запускает эти вызовы событий, но мне не удалось определить, какая строка в файлах Python tkinter привела к этим триггерам событий. .
Используя приведенный ниже код, который я бы предположил, так что см. Cnt быть близким к 0 , но в Windows я вижу только значения выше 500 000. from time import *
def test_time(f, c):
cnt = 0
for i in range(c):
ps, ts = f(), f()
if not ps - ts:
cnt...