Am 26.02.21 um 06:15 schrieb John O'Hagan:
On Thu, 25 Feb 2021 21:57:19 +0100
Christian Gollwitzer <aurio...@gmx.de> wrote:
I think it is not yet clear, if this is a bug in Tkinter or in
Tcl/Tk, the underlying scripting language. It might also be platform
dependent. Are you on Windows? Here is an equivalent Tcl program:

======================
package require Tk

proc randint {} {
        expr {int(rand()*10000000)}
}

proc display {label} {
        destroy $label
        set id [randint]
        set label [label .l$id -text [randint]]
        pack $label
        after 100 [list display $label]
}

display [label .l]
========================


Can you run this and check that the freeze also occurs? If you can't
execute the Tcl that is used by Python directly, you may also do
something like


root = Tk()
root.eval('Here comes the Tcl code')
root.mainloop()

Can you also find out what version of Tcl/Tk you are using? Try

root.eval('info patchlevel')

        Christian


I've followed your suggestions as per my last post, and can confirm
the same freezing behaviour when running your code directly as a tclsh
script on Debian Testing, Tcl 8.6.11.

You might report this as a bug to the Tcl bugtracker https://core.tcl-lang.org/tk/ticket

I guess the problem is with the steady creation of widgets. Tk was not meant to be used like that. Tkinter creates new widget names for each widget with random numbers, just like the Tcl code above does, whereas in a usual Tcl/Tk program the names are given by the programmer.

Can you also check this program, which reuses the same widget path name, albeit does the creation/destruction in cycles:

======================
package require Tk

proc randint {} {
    expr {int(rand()*10000000)}
}

proc display {label} {
    destroy $label
    set label [label .l -text [randint]]
    pack $label
    after 100 [list display $label]
}

display [label .l]
========================

As mentioned by others, typically you wouldn't continuously recreate new widgets, but either update the text of the widget (label['text']="New text") or attaching a StringVar() )

or, if you must rearrange the widgets, you pack_forget() them and then repack them.

        Christian
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to