Tk Source Code

View Ticket
Login
Ticket UUID: ca4aa4c94dc9986543ee49809725ac206dbbb152
Title: Unstable with lots of ttk::labels in subframes in two parents
Type: Bug Version: 8.6.14, 9.0b3 (Windows)
Submitter: jal_frezie Created on: 2024-09-10 13:24:14
Subsystem: 88. Themed Tk Assigned To: nobody
Priority: 5 Medium Severity: Severe
Status: Open Last Modified: 2024-09-10 18:42:22
Resolution: None Closed By: nobody
    Closed on:
Description:
Windows 11: if you have two parents, either frames or toplevels, and in each of them you pack a few thousand frames and a ttk::label in each frame, instability results. The parents may exist but fail to display, and the application may crash. This does not happen if a non-ttk label is used instead. Demo script:

foreach home {.a .b} {
    toplevel $home
    for {set i 0} {$i<3072} {incr i} {
	set capt "hello I am variable $i and I have a long caption"
	pack [ttk::frame $home.frm$i] -fill x -expand 1
	pack [ttk::label $home.frm$i.l -text $capt]
    }
}
User Comments: fvogel added on 2024-09-10 18:42:22:

Debugger says: Unhandled exception at 0x00007FFBAF028DB7 (CoreMessaging.dll) in tclsh90.exe : 0xE0464645.

This happens after the script finished, when trying to move a window.

Stack trace:

 	KernelBase.dll!00007ffbb4830612()	Inconnu
 	CoreMessaging.dll!00007ffbaf0214c8()	Inconnu
 	CoreMessaging.dll!00007ffbaf021438()	Inconnu
 	CoreMessaging.dll!00007ffbaf004852()	Inconnu
 	CoreMessaging.dll!00007ffbaf028db7()	Inconnu
 	CoreMessaging.dll!00007ffbaf0191ee()	Inconnu
 	CoreMessaging.dll!00007ffbaefa70fa()	Inconnu
 	CoreMessaging.dll!00007ffbaefb2bd4()	Inconnu
 	CoreMessaging.dll!00007ffbaefb2a0d()	Inconnu
 	CoreMessaging.dll!00007ffbaefb280c()	Inconnu
 	CoreMessaging.dll!00007ffbaefc42f5()	Inconnu
 	CoreMessaging.dll!00007ffbaef97b17()	Inconnu
 	CoreMessaging.dll!00007ffbaefd0933()	Inconnu
 	TextInputFramework.dll!00007ffba2bc5557()	Inconnu
 	TextInputFramework.dll!00007ffba2bd2a3d()	Inconnu
 	TextInputFramework.dll!00007ffba2bd281f()	Inconnu
 	TextInputFramework.dll!00007ffba2bd279a()	Inconnu
 	msctf.dll!00007ffbb584c4b6()	Inconnu
 	msctf.dll!00007ffbb584c3cb()	Inconnu
 	TextInputFramework.dll!00007ffba2bcbb7f()	Inconnu
 	TextInputFramework.dll!00007ffba2bcb8c4()	Inconnu
 	msctf.dll!00007ffbb583e2ba()	Inconnu
 	msctf.dll!00007ffbb583bc53()	Inconnu
 	msctf.dll!00007ffbb583b787()	Inconnu
 	msctf.dll!00007ffbb58480f6()	Inconnu
 	user32.dll!00007ffbb4ea6916()	Inconnu
 	ntdll.dll!00007ffbb71f4174()	Inconnu
 	win32u.dll!00007ffbb46314d4()	Inconnu
 	user32.dll!00007ffbb4ea1bef()	Inconnu
 	user32.dll!00007ffbb4ea1abc()	Inconnu
>	tcl90.dll!TclpWaitForEvent(const Tcl_Time * timePtr) Ligne 526	C
 	tcl90.dll!Tcl_WaitForEvent(const Tcl_Time * timePtr) Ligne 1351	C
 	tcl90.dll!Tcl_DoOneEvent(int flags) Ligne 986	C
 	tcl9tk90.dll!Tk_MainLoop() Ligne 2127	C
 	tcl90.dll!Tcl_MainExW(__int64 argc, wchar_t * * argv, int(*)(Tcl_Interp *) appInitProc, Tcl_Interp * interp) Ligne 563	C
 	tclsh90.exe!wmain(int argc, wchar_t * * argv) Ligne 144	C
 	[Code externe]	


jal_frezie added on 2024-09-10 17:02:06:
Also it does not matter how they are distributed. I changed my example to create around 6000 frame/label pairs across 16 toplevels. With an 'update' after filling each toplevel, all but the last few appeared, but with no update, none appeared. 

foreach home {.a .b .c .d .e .f .g .h .i .j .k .l .m .n .o .p} {
    toplevel $home
    for {set i 0} {$i<350} {incr i} {
	set capt "hello I am variable $i and I have a long caption"
	ttk::frame $home.frm$i
	ttk::label $home.frm$i.l -text $capt
	if {$i<4} {
	    pack  $home.frm$i -fill both -expand 1
	    pack $home.frm$i.l
	}
    }
    update
}

jal_frezie added on 2024-09-10 16:04:28:
Interestingly the same thing happens if you create the widgets but do not pack them!

oehhar added on 2024-09-10 14:27:44:

Hi Jasper,

thanks for all the tests. I suppose, you hit a size limit on Windows for X/Y coordinates to something like 65535. This is a known and annoying bug.

It should also happen for classic widgets. I suppose, the difference is, that the classig widgets need less space and will hit the limit later.

If a Widget on Windows gets over this size, any weired thing may happen including crash, partly display (often at 0,0 absolute position) etc.

We are all sorry but we live with that since 30 years...

Others are welcomed to comment ! Harald