简体   繁体   English

Tkinter Canvas create_window function 没有显示所需的小部件

[英]Tkinter Canvas create_window function does not show the desired widgets

I've tried to make a customized container function for my application, but when I pass the list of widgets, they does not get visible.我试图为我的应用程序制作一个自定义容器 function,但是当我传递小部件列表时,它们不可见。 The container is like the LabelFrame but with rounded corners.容器类似于LabelFrame ,但带有圆角。 I tried a lot of things, but nothing seems to work.我尝试了很多东西,但似乎没有任何效果。 Please let me know what I'm doing wrong.请让我知道我做错了什么。

Here is my code and some comments for it:这是我的代码和一些评论:

parent -> this is the top level window parent -> 这是顶层 window

lbl_text -> this will be the little text like the LabelFrame has on top lbl_text -> 这将是LabelFrame顶部的小文本

widgets -> this is the list of the widgets I would like to place in my rounded frame widgets -> 这是我想放置在圆形框架中的小部件列表

def rndframe(parent, lbl_text, widgets
    # content_positioner and max_width is for calculate the requiered size of the canvas to be big 
    # enough for all the passed widgets, and to determine the coordinates for create_window function. 
    # It works perfectly and I get all the information I want.
    content_positioner = [14]
    max_width = 1
    for i, item in enumerate(widgets):
        content_positioner.append(content_positioner[i]+widgets[i].winfo_reqheight())
        if widgets[i].winfo_reqwidth() > max_width:
            max_width = widgets[i].winfo_reqwidth()

    height = max(content_positioner)+10
    width = max_width+10

    # Here I create the canvas which will contain everything
    canv = TK.Canvas(parent, height=height, width=width, bg='green', bd=0, highlightthickness=0)
    
    # Here I draw the rounded frame
    radius = 10
    x1 = 2
    y1 = 5
    x2 = width-2
    y2 = height-2
    points = [x1+radius, y1, x2-radius, y1, x2, y1, x2, y1+radius, x2, y2-radius, x2, y2,               
              x2-radius, y2, x1+radius, y2, x1, y2, x1, y2-radius, x1, y1+radius, x1, y1]             
    canv.create_polygon(points, smooth=True, outline=DS.menu_bg, width=3, fill='')

    # Here I put the litle label in the frmae 
    label = TK.Label(parent, text=lbl_text, bg=DS.main_bg, padx=3, pady=0, fg=DS.main_textcolor)
    canv.create_window(18, 5, anchor='w', window=label)

    # And thats the part where I would like to place all the passed widgets based on the coordinate 
    # list I preveously created but nothing appear just the frame polygon and the liitle label on it.
    for w, widget in enumerate(widgets):
        canv.create_window(width/2, content_positioner[w], anchor='n', window=widgets[w])

    return canv

And finally the way I've tried to use:最后是我尝试使用的方式:

id_num = TK.Label(result_area_leaf, text='123-4567')
id_num2 = TK.Label(result_area_leaf, text='123-4567')
id_holder = rndframe(result_area_leaf, lbl_text='id', widgets=[id_num, id_num2])
id_holder.grid()

There are many problems with your code, but the root of the issue is that the widgets you're adding to the canvas have a lower stacking order than the canvas so they are behind or "under" the canvas. This is because the default stacking order is initially determined by the order that the widgets are created.您的代码有很多问题,但问题的根源是您添加到 canvas 的小部件的堆叠顺序低于 canvas,因此它们位于 canvas 的后面或“下方”。这是因为默认堆叠顺序最初由小部件的创建顺序决定。 You create the widgets before the canvas so they are lower in the stacking order.您在 canvas 之前创建小部件,因此它们的堆叠顺序较低。

The simplest solution to the stacking order problem is to raise the widgets above the canvas, which you can do with the lift method.堆叠顺序问题的最简单解决方案是将小部件提升到 canvas 以上,您可以使用lift方法来完成。

for w, widget in enumerate(widgets):
    canv.create_window(width/2, content_positioner[w], anchor='n', window=widgets[w])
    widgets[w].lift()

When I make the above modification, along with fixing all of the other problems in the code, the labels appear in the canvas.当我进行上述修改并修复代码中的所有其他问题时,标签出现在 canvas 中。

Finally I got it work.最后我得到它的工作。 First of all sorry that I didn't posted a standalone runable code firstly.首先很抱歉我没有首先发布独立的可运行代码。 When I put the code in a file and make the necessary changes about the missing variables the suggested .lift() method worked.当我将代码放入文件中并对缺失的变量进行必要的更改时,建议的.lift()方法起作用了。 And the reason was that in that single file I used the root window as parent.原因是在那个单个文件中,我使用根目录 window 作为父目录。

In my copied code the two Lables ( id_num and id_num2 ) have a Canvas for parent (result_area_leaf) and that was the problem.在我复制的代码中,两个标签( id_numid_num2 )有一个 Canvas 用于父级(result_area_leaf),这就是问题所在。 If I made my root window as parent for the passed widgets, the widgets are shown.如果我将我的根 window 作为传递的小部件的父级,则会显示这些小部件。 The .lift() actually does not needed after all. .lift()实际上根本不需要。

Thanks guys;)谢谢你们;)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM