使用tkinter,在我将树和按钮放在画布上时,为什么它们会消失?

huangapple go评论73阅读模式
英文:

Using tkinter, when I place my tree and buttons on the canvas why do they disappear?

问题

以下是您的代码:

import tkinter
from tkinter import ttk
from tkinter import *

root = tkinter.Tk()
root.geometry("1500x900")
root.title("Writer")

canvas = tkinter.Canvas(root, borderwidth=10)
frame = tkinter.Frame(canvas)
vsb = tkinter.Scrollbar(root, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)
canvas.pack(side="left", fill="both", expand=True)
canvas.create_window((0, 0), window=frame, anchor="nw")
frame.bind("<Configure>", lambda event, canvas=canvas: canvas.configure(scrollregion=canvas.bbox("all")))

def treeframe1(rows, df):
    tree["columns"] = list(range(1, len(df.columns) + 1))
    tree['show'] = 'headings'
    tree['height'] = '45'

    colnames = df.columns

    tree.column(1, width=90, anchor='c')
    tree.heading(1, text=colnames[0])

    for i in range(2, len(df.columns) + 1):
        tree.column(i, width=100, anchor='c')
        tree.heading(i, text=colnames[i - 1])

    for i in rows:
        tree.insert('', 'end', values=i)

tree = ttk.Treeview(root, selectmode='browse', height='45')
tree.place(x=960 + 200 + 00, y=45, width=920)
vsb = ttk.Scrollbar(root, orient="vertical", command=tree.yview)
vsb.place(x=950 + 200 + 00, y=45, height=930)
tree.configure(yscrollcommand=vsb.set)
vsb = ttk.Scrollbar(root, orient="horizontal", command=tree.xview)
vsb.place(x=960 + 200 + 00, y=970, width=960)
tree.configure(xscrollcommand=vsb.set)

b1 = Button(root, text="dd1", width=15)
b1.place(x=650 + 200, y=465 + 200 - 600 + 5)

b2 = Button(root, text="dd2", width=15)
b2.place(x=650 + 200, y=515 + 200 - 600 + 5)

b3 = Button(root, text="dd3", width=15)
b3.place(x=650 + 200, y=565 + 200 - 600 + 5)

root.mainloop()

当我将它们放在画布上(即将"root"替换为"frame")时,我看不到它们。为什么会发生这种情况?

我是 tkinter 新手,如果有人能修改代码使其正常工作,将非常有帮助。

英文:

below are my codes

when I place my tree and buttons on the root I can see them

import tkinter
from tkinter import ttk
from tkinter import *
root = tkinter.Tk()
root.geometry(&quot;1500x900&quot;)
root.title(&quot;Writer&quot;)
canvas = tkinter.Canvas(root, borderwidth=10)
frame = tkinter.Frame(canvas)
vsb = tkinter.Scrollbar(root, orient=&quot;vertical&quot;, command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)
canvas.pack(side=&quot;left&quot;, fill=&quot;both&quot;, expand=True)
canvas.create_window((0, 0), window=frame, anchor=&quot;nw&quot;)
frame.bind(&quot;&lt;Configure&gt;&quot;, lambda event, canvas=canvas: canvas.configure(scrollregion=canvas.bbox(&quot;all&quot;)))
def treeframe1(rows, df):
tree[&quot;columns&quot;] = list(range(1, len(df.columns) + 1))
tree[&#39;show&#39;] = &#39;headings&#39;
tree[&#39;height&#39;] = &#39;45&#39;
colnames = df.columns
tree.column(1, width=90, anchor=&#39;c&#39;)
tree.heading(1, text=colnames[0])
for i in range(2, len(df.columns) + 1):
tree.column(i, width=100, anchor=&#39;c&#39;)
tree.heading(i, text=colnames[i - 1])
for i in rows:
tree.insert(&#39;&#39;, &#39;end&#39;, values=i)
tree = ttk.Treeview(root, selectmode=&#39;browse&#39;, height=&#39;45&#39;)
tree.place(x=960 + 200 + 00, y=45, width=920)
vsb = ttk.Scrollbar(root, orient=&quot;vertical&quot;, command=tree.yview)
vsb.place(x=950 + 200 + 00, y=45, height=930)
tree.configure(yscrollcommand=vsb.set)
vsb = ttk.Scrollbar(root, orient=&quot;horizontal&quot;, command=tree.xview)
vsb.place(x=960 + 200 + 00, y=970, width=960)
tree.configure(xscrollcommand=vsb.set)
b1 = Button(root, text=&quot;dd1&quot;, width=15)
b1.place(x=650 + 200, y=465 + 200 - 600 + 5)
b2 = Button(root, text=&quot;dd2&quot;, width=15)
b2.place(x=650 + 200, y=515 + 200 - 600 + 5)
b3 = Button(root, text=&quot;dd3&quot;, width=15,)
b3.place(x=650 + 200, y=565 + 200 - 600 + 5)
root.mainloop()

but when I place them on the canvas (i.e. replacing the "root" with "frame") i dont see them. Why is that happening?

I am new to tkinter so if someone to modify the code to make it work that would be really helpful

答案1

得分: 1

问题的根本在于您没有为框架指定大小,因此它默认为一个像素。然后,您正在使用 place 将按钮放置在框架中,而 place 不会导致包含小部件(frame)调整大小以适应其子元素。因此,框架保持1像素宽和1像素高。

您可以通过为框架指定足够大的显式宽度和高度来轻松查看这一点。例如,如果您执行 canvas.create_window((0, 0), window=frame, anchor="nw", width=1100, height=1100),按钮将会显示出来。

英文:

The root of the problem is that you haven't given the frame a size, so it defaults to being one pixel. You are then using place to put the buttons in the frame, and place won't cause the containing widget (frame) to resize to fit its children. So, the frame remains 1 pixel wide and 1 pixel tall.

You can easily see this by giving the frame an explicit width and height that is big enough to fill the space. For example, if you do canvas.create_window((0, 0), window=frame, anchor=&quot;nw&quot;, width=1100, height=1100) the buttons will appear.

答案2

得分: 0

你应该使用 packgrid 而不是 place 来添加这些按钮。

b1 = Button(frame, text="dd1", width=15)
b1.pack(padx=(850, 0), pady=(50, 0))

b2 = Button(frame, text="dd2", width=15)
b2.pack(padx=(850, 0), pady=(50, 0))

b3 = Button(frame, text="dd3", width=15)
b3.pack(padx=(850, 0), pady=(50, 0))

你可以使用 padxpady 来调整按钮在框架上的位置。我添加了任意值以使其在位置上类似于你的 place 值。

英文:

You should use pack or grid instead of place to add the Buttons.

b1 = Button(frame, text=&quot;dd1&quot;, width=15)
b1.pack(padx=(850, 0), pady=(50, 0))
b2 = Button(frame, text=&quot;dd2&quot;, width=15)
b2.pack(padx=(850, 0), pady=(50, 0))
b3 = Button(frame, text=&quot;dd3&quot;, width=15)
b3.pack(padx=(850, 0), pady=(50, 0))

You can use padx and pady to adjust the location of the buttons on the Frame. I added arbitrary values to make it a similar location to your place values.

huangapple
  • 本文由 发表于 2023年5月17日 21:15:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/76272523.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定