2

我的目标是解决网格超出窗口的问题(如图1)

在此处输入图像描述

我的程序功能是创建一个由用户定义的列数的网格。

我尝试使用画布来解决这个问题,但它仍然无法成功。它没有在画布中显示完整的网格。(如图2所示) 在此处输入图像描述

以下是我的代码,请您帮忙解决问题或给我一些建议。非常感谢。

代码:

import tkinter as tk
import tkinter.messagebox
import tkinter.filedialog

MainWindow = tk.Tk()

MainWindow.title('Helloworld')
MainWindow.geometry('1000x800')

def btn_generate():
    global EntryNamelist
    global Entrycoordinatelist
    global EntryLabellist
    con_num = en_condition_num.get()
    if con_num != '':
        #### Grid Body
        for i in range(1,int(con_num) +1 ):
                lb_name = tk.Label(fm_grid, text="Condition" + str(i) )
                lb_name.grid(row=i, column=0, padx=2, pady=1, ipadx=20, ipady=5)  
                En_name = tk.Entry(fm_grid, bd = 2,width = 10,font=('Ubuntu', 10))
                En_name.grid(row=i, column=1, padx=2, pady=1, ipadx=35, ipady=5) 
                En_coor = tk.Entry(fm_grid, bd = 2,width = 10,font=('Ubuntu', 10))
                En_coor.grid(row=i, column=2, padx=2, pady=1, ipadx=200, ipady=5)

    else:
        tk.messagebox.showerror("Error", "Please input a num of conditions")

fm_main = tk.Frame()
fm3 = tk.Frame(fm_main)
lb_condition = tk.Label(fm3,text = 'Please input the number of condition')
lb_condition.pack(side="left")
en_condition_num = tk.Entry(fm3, bd = 2,width = 5)
en_condition_num.pack()
fm3.pack()

btn_generate = tk.Button(fm_main,text="Generate Grid",command=btn_generate)
btn_generate.pack()
lb_en = tk.Label(fm_main,text = '')
lb_en.pack()

def myfunction(event):
    canvas.configure(scrollregion=canvas.bbox("all"),width=200,height=200)

canvas=tk.Canvas(fm_main)
fm_grid = tk.Frame(canvas)
fm_grid.pack()
myscrollbar=tk.Scrollbar(fm_main,orient="vertical",command=canvas.yview)
canvas.configure(yscrollcommand=myscrollbar.set)
myscrollbar.pack(side="right",fill="y")
canvas.pack(side="left")
canvas.create_window((4,4),window=fm_grid,anchor='nw')
fm_grid.bind("<Configure>",myfunction)
fm_main.pack()
MainWindow.mainloop()
4

1 回答 1

0

问题:它没有在画布中显示完整的网格

你必须同步,里面width的。 CanvaswidthFrame

fm_grid = tk.Frame(canvas, bg='blue')如图所示'blue'

在此处输入图像描述


不要的:
删除fm_grid.pack(),你的布局与:canvas.create_window(...
另外,我建议不要使用 offset (4, 4),因为您必须在每个canvas.configure(..., width=width + 4. 改用(0, 0). _

# fm_grid.pack()
...
canvas.create_window((4,4),window=fm_grid,anchor='nw')

没用,动态创建窗口:

  • 您的使用canvas.bbox是无用的,因为它是您要布局此小部件的维度。

  • 使用一个固定的width=200,小于fm_grid.width总是剪切fm_grid内容,它也不是动态的。

      canvas.configure(scrollregion=canvas.bbox("all"),width=200,height=200)
    

如何同步 the widthof theCanvaswidththe Frameinside?

  • 你绑定fm_grid.bind("<Configure>",所以event.widget fm_grid,在Frame里面。
  • event.widget从那里获取 的尺寸w.winfo_...并构建一个bbox元组来设置scrollregion
  • 用于width设置canvas.width,与 同步event.widget.winfo_width()

    class ScrollCanvas(tk.Canvas):
        def __init__(self, parent, **kwargs):
            super().__init__(parent, **kwargs)
    
        def create_window(self, child):
            super().create_window((0, 0), window=child, anchor='nw')
            child.bind("<Configure>", self.on_configure)
    
        def on_configure(self, event):
            w = event.widget        
            bbox = x, y, width, height = 0, 0, w.winfo_width(), w.winfo_height()
            self.configure(scrollregion=bbox, width=width)
    

    用 Python 测试:3.5 - 'TclVersion':8.6 'TkVersion':8.6

于 2019-10-03T12:43:35.203 回答