微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Tkinter的创建动态滚动网格

如何解决如何在Tkinter的创建动态滚动网格

当我说一个动态网格我说的栅格,调整根据窗口宽度的列(如自举)的数目,所以必须调节“卡”。因此,当我说滚动...以及...更容易理解。

我已经试过2个aproachs:

  1. 创建动态网格,然后使之滚动的。
  2. 创建一个可滚动网格,然后使其动态。

我未能左右逢源!我发现,对于正在滚动的网格不能在一个简单的框架,它必须在一个画布。和用于帆布我有一个很难使其动态。

向下这是我的动态网格代码

class DynaGrid(tk.Frame):
    def __init__(self,master=None,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.columns = None
        self.bind('<Configure>',self.re_grid)

    def re_grid(self,event=None):
        grid_width = self.winfo_width()
        slaves = self.grid_slaves()
        slaves_width = slaves[1].winfo_width()
        cols = grid_width // slaves_width
        if (cols == self.columns) | (cols == 0):  
            return
        for i,slave in enumerate(reversed(slaves)):
            slave.grid_forget()
            slave.grid(row=i // cols,column=i % cols)
        self.columns = cols

class CardFrame(tk.Frame):
    def __init__(self,bd=1,relief=tk.RAISED,**kwargs)

        tk.Label(self,text="Hello").pack()
   
def main():
    root = tk.Tk()
    frame = DynaGrid(root)
    frame.pack(fill=tk.BOTH,expand=True)

CardFrame(frame).grid() 
CardFrame(frame).grid()
CardFrame(frame).grid() 
CardFrame(frame).grid()
CardFrame(frame).grid() 
CardFrame(frame).grid()
CardFrame(frame).grid() 
CardFrame(frame).grid()
root.mainloop()

if __name__ == '__main__':
    main()

我不会浪费别人的时间张贴我这里乱帆布代码,而不是我有一个https://blog.tecladocode.com/tkinter-scrollable-frames/ 我做了用我的“卡”,而不是标签的变化。

import tkinter as tk
from tkinter import ttk


class ScrollableFrame(ttk.Frame):
    def __init__(self,container,*args,**kwargs):
        super().__init__(container,**kwargs)
        canvas = tk.Canvas(self)
        scrollbar = ttk.Scrollbar(self,orient="vertical",command=canvas.yview)
        self.scrollable_frame = ttk.Frame(canvas)

        self.scrollable_frame.bind(
            "<Configure>",lambda e: canvas.configure(
                scrollregion=canvas.bBox("all")
            )
        )

        canvas.create_window((0,0),window=self.scrollable_frame,anchor="nw")

        canvas.configure(yscrollcommand=scrollbar.set)

        canvas.pack(side="left",fill="both",expand=True)
        scrollbar.pack(side="right",fill="y")

class TestFrame(tk.Frame):
    def __init__(self,bd=5,text="name").pack(pady=10)
  
root = tk.Tk()
frame = ScrollableFrame(root)

for i in range(50):

    TestFrame(frame.scrollable_frame).grid()

frame.pack()
root.mainloop()

要进行动态滚动帆布棘手的部分这里是使用画布内的re_grid功能。我失去了在如何我会像我在dynaGrid代码没有得到正确的窗口的宽度。

在最后我想混搭这两个码的;一类是某种与横向滚动动态网格帧。

解决方法

你的画布是你班级中的一个框架, 因此,您需要做的是将重新网格功能绑定到主框架并保持可滚动框架配置回调原样。然后更改画布内的网格,而不是重新网格功能中的“动态网格”。就那么简单! 而且我认为更容易说:我想创建一个行为类似于文件资源管理器的窗口

import tkinter as tk
from tkinter import ttk


class ScrollableFrame(ttk.Frame):
    def _init_(self,container,*args,**kwargs):
        super()._init_(container,**kwargs)
        canvas = tk.Canvas(self)
        scrollbar = ttk.Scrollbar(self,orient="vertical",command=canvas.yview)
        self.scrollable_frame = ttk.Frame(canvas)
        self.columns=0

        self.scrollable_frame.bind(
            "<Configure>",lambda e: canvas.configure(
                scrollregion=canvas.bbox("all")
            )
        )

        self.bind('<Configure>',self.regrid)

        canvas.create_window((0,0),window=self.scrollable_frame,anchor="nw")

        canvas.configure(yscrollcommand=scrollbar.set)

        canvas.pack(side="left",fill="both",expand=True)
        scrollbar.pack(side="right",fill="y")

    def regrid(self,event=None):
        print(type(self))
        grid_width = self.winfo_width()
        slaves = self.scrollable_frame.grid_slaves()
        print(len(slaves))
        slaves_width = slaves[1].winfo_width()
        cols = grid_width // slaves_width
        if (cols == self.columns) | (cols == 0):  # if the column number has not changed,abort
            return
        for i,slave in enumerate(reversed(slaves)):
            slave.grid_forget()
            slave.grid(row=i // cols,column=i % cols)
        self.columns = cols

class TestFrame(tk.Frame):
    def _init_(self,master=None,**kwargs):
        tk.Frame._init_(self,master,bd=5,relief=tk.RAISED,**kwargs)

        tk.Label(self,text="name").pack(pady=10)
        tk.Label(self,text=" info ........ info ").pack(pady=10)


root = tk.Tk()
frame = ScrollableFrame(root)

for i in range(10):
    TestFrame(frame.scrollable_frame).grid()
    TestFrame(frame.scrollable_frame).grid()

frame.pack(side="left",fill=tk.BOTH,expand=True)
root.mainloop()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。