How to debug an unfired tkinter event?

jfong at ms4.hinet.net jfong at ms4.hinet.net
Thu Oct 19 23:26:42 EDT 2017


Peter Otten於 2017年10月20日星期五 UTC+8上午4時37分10秒寫道:
> jfong at ms4.hinet.net wrote:
> 
> > Peter Otten於 2017年10月19日星期四 UTC+8下午6時04分39秒寫道:
> >> jfong at ms4.hinet.net wrote:
> >> 
> >> > Peter Otten at 2017-10-19 UTC+8 PM 3:24:30 wrote:
> >> >> It's not clear to me what you mean with this. Did you place the table
> >> >> from the recipe elsewhere inside a window that you created or did you
> >> >> make changes in the recipe's code?
> >> > 
> >> > Thank you, Peter. I am using Python 3.4.4 under WinXP.
> >> > 
> >> > When running the file directly from download, I get a table scrolling
> >> > vertically only. If its Table class's __init__ parameter
> >> > "scroll_horizontally" changed to True, it can be scrolled horizontally
> >> > also. But there is a problem when scrolled horizontally, the header
> >> > field will not align with data field anymore. I make some modifications
> >> > to make it does. So far so good.
> >> > 
> >> > Later, I want to make the table also has a vertical header. The first
> >> > step I had taken was to move all 2nd top-level widgets(not much, just
> >> > four) to right one column further to make room for this new widget. I
> >> > though it's a simple work, just increase their grid column value by 1.
> >> > But Murphy's Law comes, the xscrollbar even don't show up when the
> >> > table was squeezed horizontally.
> >> 
> >> Thank you for the clarification; I understand your problem much better
> >> now.
> >> 
> >> > 
> >> >> > The canvas has a binding:
> >> >> >         self.canvas.bind('<Configure>', self._on_canvas_configure)
> >> >> > 
> >> >> > After this movement, the callback was only triggered when dragging
> >> >> > the root widget to resize canvas vertically, but not horizontally.
> >> >> > 
> >> >> > Event seems has OS involved(it's MS Windows XP in my case). How to
> >> >> > debug this kind of problem, under pdb?
> >> >> 
> >> >> I don't know, but if you can post a small example script that
> >> >> demonstrates the problem, and you are lucky, someone will see the
> >> >> problem.
> >> > 
> >> > This is a ~5xx lines file and I think it's not fare to ask forum
> >> > members to look through it. So I decide to ask for help on how to debug
> >> > it, instead of the solution.
> >> > 
> >> > I try to change the binding to
> >> >          self.bind_all('<Configure>', self._on_canvas_configure)
> >> > and add a line into the callback
> >> >          print(event.widget)
> >> > 
> >> > I got some info below each time when I squeeze the table:
> >> > .
> >> > .50077776
> >> > .50077776.50712528
> >> > .50077776.50712496
> >> > .50077776.50712464
> >> > .50077776.50712144
> >> > .50077776.50712528.50712560.50782256
> >> > .50077776.50712528.50712560.50782256.50783024
> >> > .50077776.50712528.50712560.50782256
> >> > .50077776.50712528.50712560.50782256.50783024
> >> > 
> >> > How to change these number(is it a widget ID?) to a meaning name?
> >> 
> >> That's the name of the widget in the underlying tcl/tk. You can specify
> >> it in Python:
> >> 
> >> >>> import tkinter as tk
> >> >>> print(tk.Button())
> >> .139817813335904
> >> >>> print(tk.Button(name="mybutton"))
> >> .mybutton
> >> 
> >> You have to ensure that names are unique.
> > 
> > Thank you. It's very helpful information.
> > 
> > By the way, I just found this problem can be easily seen by not modifing
> > the original file too much with the following steps:
> > 
> > 1. copy and get the file from the link.
> > 2. change the "scroll_horizontally" parameter in the "Table" class's
> > __init__ method to "True"
> > 
> > Running it you will see it perform correctly.
> > 
> > 3. Change the "column=x" at line 268, 282, 288, 292, 303 to "column=x+1"
> > 
> > Now it has the problem.
> 
> There may be other less obvious places that are affected by your 
> modifications. Does changing
> 
> self.grid_columnconfigure(0, weight=1)
> 
> to
> 
> self.grid_columnconfigure(1, weight=1)
> 
> in Table.__init__() help?

There is description about those numbers in the "tkinter 8.5 reference manual" section 5.11 Window names. It can be read by w.winfo_name().

After I give every widget a name(using the same Python instance name), the utput looks better. Below is the output of the failed one when squeezed horizontally:

.table
.table.scrolling_area
.table.yscrollbar
.table.xscrollbar
.table.canvasH
.table.scrolling_area.canvas.innerframe
.table.scrolling_area.canvas.innerframe._body
.table.scrolling_area.canvas.innerframe
.table.scrolling_area.canvas.innerframe._body

Compared to the output of a good one:

.table
.table.scrolling_area
.table.yscrollbar
.table.xscrollbar
.table.canvasH
.table.scrolling_area.canvas

It shows, when the size changed, the failed one fires onto the wrong widgets(the innerframe and innerframe._body), not the canvas. The canvas widget didn't absorb the space changing!!

That's prove your intuition is correct. The problem is at the column's weight setting. After does the changes according to your suggestion, the problem is solved. La la!

Thank you again, Peter!



More information about the Python-list mailing list