Python Tkinter在风中自动调整滚动画布的大小

2024-06-17 11:48:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python和tkinter创建了一个简单的应用程序接口。你知道吗

[您可以运行代码]

里面有两个框架[自我约束]框架。 第一帧是标题[自动头架]第二帧[self.c框架]是滚动画布中动态填充的列表[自我满足]. 因为滚动画布中的项目数[自我满足]将改变,我需要调整画布每次列表填充或窗口大小。你知道吗

from tkinter import *
import tkinter.font as font
from PIL import Image, ImageTk

class wmGUI (object):    
    def __init__ (self,tittle,itemnum):
        self.tittle=tittle

        self.GUI = wmWINDOW(self.tittle,itemnum)


class wmWINDOW(Tk):    
    windowwidth,windowheight,sliderresizer = 250,600,100

    def __init__ (self,tittle,itemnum):
        super().__init__()    
        WW = self.winfo_screenwidth()
        WH = self.winfo_screenheight()
        print('WW : %d & WH : %d' % (WW,WH))
        geometry = '{width}x{height}+{pos_x}+{pos_y}'.format(height=WH, width=self.windowwidth, pos_y=0, pos_x=WW-self.windowwidth-20)
        self.geometry(geometry)
        self.configure(background='grey')
        self.title("GUI")
        self.itemnum=itemnum
        self.resizable(width=False, height=True)
        self.attributes('-topmost',True)
        self.CreateMenus()
        self.Myfont= font.Font(family="Arial", size=8, weight=font.NORMAL)
        self.Myfont2 = font.Font(family="Helvetica", size=9, weight=font.BOLD)
        self.Myfont3 = font.Font(family="Helvetica", size=7, weight=font.BOLD)
        self.CON=Frame(self,width=self.windowwidth,height=WH)
        self.MakeHeader()
        self.MakeContent()
        self.CON.pack(fill=BOTH, expand=YES)
        self.RUN()

    def MakeHeader (self):

        self.HeaderFrame= Frame(self.CON, width=self.windowwidth,height=60, background='Blue',borderwidth=0 )
        self.HeaderFrame.propagate(1)
        hImage = Image.open("images/header.jpg")
        headerImage=ImageTk.PhotoImage(hImage, width= self.windowwidth, height=60)
        self.headerLabel=Label(self.HeaderFrame,image=headerImage, width= self.windowwidth, height=60, borderwidth=0, highlightthickness=0)
        self.headerLabel.image=headerImage
        self.headerLabel.pack( )
        self.HeaderFrame.pack( padx=0,pady=0,ipadx=0,ipady=0)

    def MakeContent (self):

        self.CFrame = Frame(self.CON, width=self.windowwidth,bg="cyan")
        self.Content = Canvas(self.CFrame, width=self.windowwidth-15, bg="green",borderwidth=0, highlightthickness=0)
        self.ContentFrame = Frame(self.Content, bg="#EBEBEB",height=100)
        self.Content.create_window(0, 0, window=self.ContentFrame, anchor='nw')
        self.ContentFrame.bind("<Configure>", self.on_change)
        self.Items()
        self.CScrollbar = Scrollbar(self.CFrame, orient=VERTICAL , width=15)
        self.CScrollbar.config(command=self.Content.yview)
        self.Content.config(yscrollcommand=self.CScrollbar.set)
        self.CScrollbar.grid(row=0, column=1, sticky="ns")
        self.Content.grid(row=0, column=0, sticky="nsew")
        self.CFrame.pack(fill=BOTH, expand=YES)
        self.Content.configure(height=self.CON.winfo_reqheight() - 60)

    def on_change(self,event):
        self.Content.configure(scrollregion=self.Content.bbox("all"))

    def Items(self):
        for n in range(self.itemnum):
                LabelFrame(self.ContentFrame, text='Example Item {}'.format(n) , font=self.Myfont3, bg="yellow", fg="black",width=self.windowwidth,height=40).grid()

    def RUN (self):
        self.mainloop()

    def CreateMenus(self):
        #MAIN MENUBAR
        MenuBar = Menu(self) #Creates Menu bar
        self.config(menu=MenuBar)

        # FILE MENU
        FileMenu=Menu(MenuBar,tearoff=0)
        FileMenu.add_command(label="Open",command=None) #command=bewritten
        FileMenu.add_command(label="Close",command=None)  
        FileMenu.add_separator()  
        FileMenu.add_command(label="Reset",  accelerator="Ctrl + Shift + r")  
        FileMenu.add_separator()
        FileMenu.add_command(label="Quit", command= None,accelerator="Ctrl q") 
        MenuBar.add_cascade(label="File",menu=FileMenu)

WMGUI=wmGUI('My Window',50)

我想调整画布的大小[自我满足]我应该检索窗的内部高度。但是我找不到方法。 我该怎么做?你知道吗


Tags: selfadddefcontentwidthconlabelcommand
1条回答
网友
1楼 · 发布于 2024-06-17 11:48:47

我找到了解决办法。这里的例子真的很有帮助。。 LINK

窗口中帧的格式如下

[Frame CON]-[Frame Header]-[Frame Content]-[Content Canvas]>;[/Frame CON]

我把函数改为自我约束;容器框架,因为每次更改CON内容时,容器框架都会更改。你知道吗

self.CON.bind("<Configure>", self.on_change)

我将“更改”功能更改为:

def on_change(self,event):
    self.Content.configure(scrollregion=self.Content.bbox("all"))
    self.Content.configure(height=self.CON.winfo_height()-60)

所以在一个事件中,onchange事件获取CON容器框架的高度,并在每次CON更改时将height-60应用于画布。你知道吗

这真的工作为滚动条调整大小时,内容创建。。。你知道吗

还向根窗口添加了事件处理程序。这将在窗口大小更改时调整滚动条的大小。你知道吗

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

好像一切都好了。。。你知道吗

相关问题 更多 >