簡體   English   中英

Python-Tkinter框架的XY滾動無法有效加載小部件

[英]Python - XY Scrolling of a Tkinter Frame deosn't load widgets effectively

我有當前代碼(從原始代碼中刪減了)-此代碼段也可在此處獲得

import tkinter as tk
import tkinter.ttk as ttk
class ScrolledFrame(tk.Frame):
    def __init__(self, master, **kw):
        tk.Frame.__init__(self, master, **kw)
        vsb = tk.Scrollbar(self, orient='vertical')
        vsb.grid(column=1, row=0, sticky='ns')
        hsb = tk.Scrollbar(self, orient='horizontal')
        hsb.grid(column=0, row=1, sticky='ew')

        self.canvas = canvas = tk.Canvas(self, bd=0, highlightthickness=0,
                        yscrollcommand=vsb.set, xscrollcommand=hsb.set)
        canvas.grid(row=0, column=0, sticky='nsew')
        #canvas.configure(scrollregion=canvas.bbox('all'))
        vsb.config(command=canvas.yview)
        hsb.config(command=canvas.xview)
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

        # reset the view
        canvas.xview_moveto(0)
        canvas.yview_moveto(0)

        self.interior = interior = tk.Frame(canvas)
        interior_id = canvas.create_window(0, 0, window=interior,
                                           anchor='nw')

        def _configure_interior(event):
            size = (interior.winfo_reqwidth(), interior.winfo_reqheight())
            canvas.config(scrollregion="0 0 %s %s" % size)
            if interior.winfo_reqwidth() != canvas.winfo_width():
                canvas.config(width=interior.winfo_reqwidth())
        interior.bind('<Configure>', _configure_interior)

        def _configure_canvas(event):
            if interior.winfo_reqwidth() != canvas.winfo_width():
                canvas.itemconfigure(interior_id, width=canvas.winfo_width())
        canvas.bind('<Configure>', _configure_canvas)

if __name__ == '__main__':
    root = tk.Tk()
    main_frame = ScrolledFrame(root)
    main_frame.grid(row=0, column=0, sticky='nsew')
    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)
    for i in range(100): tk.Button(main_frame.interior, text=f'test {i}').grid(row=0, column=i)
    root.geometry('360x240')
    root.mainloop()

該代碼的目的也是要有一個可同時通過x和y軸滾動的框架。 但是,出現了一個問題,其中在x軸上滾動導致未繪制項目: 例子不起作用

但是,y軸似乎可以完美工作-我試圖通過程序使用不同的scrollregion=設置(即'all' )進行更改,但並沒有成功,它似乎完全刪除了x軸的功能。

您明確地將內部框架的寬度設置為與畫布的寬度相同。 例如,程序啟動時,畫布的寬度將小於360像素,因此您將內部框架設置為該尺寸。 在我的機器上,最終為309像素。 因此,當您滾動時,您將只能看到價值309像素的按鈕。

滾動的全部目的是您試圖看到比窗口大的東西,但是您在人為地使內部框架的大小與窗口相同。

您應該停止強制內部框架與畫布大小相同,或者至少停止強迫其小於畫布。 它必須是其自然大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM