Превышена максимальная глубина рекурсии при рисовании окон в tkinterPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Превышена максимальная глубина рекурсии при рисовании окон в tkinter

Сообщение Anonymous »

Я пытаюсь создать приложение с помощью Tkinter и CustomTkinter, но иногда оно не сообщает, что оно достигло максимальной глубины рекурсии. Ошибка обычно возникает при изменении масштаба вида и реже при открытии новых окон. Следующий пример не работает при изменении масштаба:

Код: Выделить всё

import tkinter as tk
from hdpitkinter import HdpiTk
import customtkinter as ctk
import ctypes

def rescale(event, root, frames, scrolls):
scale_factor = ctypes.windll.shcore.GetScaleFactorForDevice(0)/100
print(scale_factor)
width = root.winfo_width()//scale_factor
height = root.winfo_height()//scale_factor
print("Width = ", width, "Height = ", height, "type", type(width))
for i in range(3):
frames[i].configure(width = width-10,height=(height//3)-30)
scrolls[i].configure(width = (width/2)-40,height=(height//3)-50)
scrolls[i+3].configure(width = (width/2)-40,height=(height//3)-50)
# Updates window
root.update_idletasks()

if __name__ == "__main__":
root = ctk.CTk()
root.geometry("1280x720")
root.minsize(width=1280,height=720)
root.title("Test")
root.configure(fg_color = "#4B4B4B")
height = 720
width = 1280

frames, scrolls, labels = [], [], []

leftFont = ctk.CTkFont(family="Inter", size=20, weight="normal")
rightFont = ctk.CTkFont(family="Inter", size=15, weight="normal")

# Base frames creation
for i in range(3):
frames.append(ctk.CTkFrame(master=root,fg_color="#504F4F", corner_radius=10, width = width-10, height=height/3-46))
# ScrollFrames creation
for i in range(6):
scrolls.append(ctk.CTkScrollableFrame(master=frames[i%3],fg_color="#504F4F", corner_radius= 10,width = ((width/2)-40)))
# Buttons creation
button1 = ctk.CTkButton(root, text="button1", font=leftFont, corner_radius=10,
fg_color="#1E1E1E", text_color="white", height=40)
button2 = ctk.CTkButton(root, text="button2", font=leftFont, corner_radius=10,
fg_color="#1E1E1E", text_color="white", height=40)
button3 = ctk.CTkButton(root, text="button3", font=leftFont, corner_radius=10,
fg_color="#1E1E1E", text_color="white", height=40)
# Placing of buttons
button1.grid(column = 0, row = 3,pady = 5, padx = 10, sticky="w")
button2.grid(column = 1, row = 3,pady = 5, padx = 10, sticky="w")
button3.grid(column = 1, row = 3,pady = 5, sticky="e")
# Frames placing
for i in range(3):
frames[i].grid(column= 0, row = i, columnspan=2, padx=3, pady=3,)
# Scrolls and labels placing
for i in range(3):
scrolls[i].grid(row = 0, column=0, padx = 5)
scrolls[i+3].grid(row = 0, column=1, padx = 5)
# Bind rescale method
root.bind("", lambda event, root = root, frames = frames, scrolls = scrolls: rescale(event, root, frames, scrolls))
root.mainloop()
Полная ошибка заключается в следующем:

Код: Выделить всё

Traceback (most recent call last):
File "d:\lib\tkinter\__init__.py", line 1921, in __call__
return self.func(*args)
File "D:\test.py", line 58, in 
root.bind("", lambda event, root = root, frames = frames, scrolls = scrolls: rescale(event, root, frames, scrolls))
File "D:\test.py", line 13, in rescale
frames[i].configure(width = width-10,height=(height//3)-30)
File "d:\lib\site-packages\customtkinter\windows\widgets\ctk_frame.py", line 167, in configure
super().configure(require_redraw=require_redraw, **kwargs)
File "d:\lib\site-packages\customtkinter\windows\widgets\core_widget_classes\ctk_base_class.py", line 117, in configure
self._set_dimensions(width=kwargs.pop("width"))
File "d:\lib\site-packages\customtkinter\windows\widgets\ctk_frame.py", line 88, in _set_dimensions
super()._set_dimensions(width, height)
File "d:\lib\site-packages\customtkinter\windows\widgets\core_widget_classes\ctk_base_class.py", line 240, in _set_dimensions
super().configure(width=self._apply_widget_scaling(self._desired_width),
RecursionError:  maximum recursion depth exceeded while calling a Python object

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "D:\test.py", line 59, in 
root.mainloop()
File "d:\lib\site-packages\customtkinter\windows\ctk_tk.py", line 165, in mainloop
super().mainloop(*args, **kwargs)
File "d:\lib\tkinter\__init__.py", line 1458, in mainloop
self.tk.mainloop(n)
File "d:\lib\tkinter\__init__.py", line 1925, in __call__
self.widget._report_exception()
File "d:\lib\tkinter\__init__.py", line 1641, in _report_exception
root.report_callback_exception(exc, val, tb)
File "d:\lib\tkinter\__init__.py", line 2379, in report_callback_exception
traceback.print_exception(exc, val, tb)
File "d:\lib\traceback.py", line 119, in print_exception
te = TracebackException(type(value), value, tb, limit=limit, compact=True)
File "d:\lib\traceback.py", line 502, in __init__
self.stack = StackSummary.extract(
File "\lib\traceback.py", line 353, in extract
limit = getattr(sys, 'tracebacklimit', None)
RecursionError: maximum recursion depth exceeded while calling a Python object
Я обнаружил, что изменение фреймов.configure(width = width-10,height=(height//3)-35) с помощью фреймов. configure(width = width-10,height=(height//3)-30) работает, обновление занимает много времени, но работает. Также проблема не только в масштабировании как таковом, потому что в проекте у меня есть главное окно, которое открывает другие окна, а также выдает ошибку при создании некоторых из них.
Я нашел еще одну вещь. заключается в том, что если я создаю новую среду conda, проблема решается, загрузка окна все равно занимает много времени, но оно это делает.
Итак, мой вопрос: есть ли способ сделать уверены, что этого не произойдет, если я установлю его в другом месте или скомпилирую в exe?

Подробнее здесь: https://stackoverflow.com/questions/785 ... in-tkinter
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»