簡體   English   中英

Python Tkinter的問題:畫布中的框架

[英]Issues with Python Tkinter: Frames within a Canvas

我正在嘗試設置一系列可滾動的框架,因此將它們嵌套在畫布中。 下面,我提供了一些示例代碼來演示該問題。

但是,我有三個問題:

  1. 框架c似乎沒有水平擴展以填充畫布。
  2. 如果使用多個框架c ,則畫布滾動,但是如果我嘗試將FrameRow嵌套到單個框架c ,則畫布將不再滾動。
  3. 對於多個幀c ,將切除FrameRow的最后一個。

按鈕“左”和“右”演示了當按鈕未嵌套在Canvas中時得到的行為。

我更喜歡使用單個Frame c並在其中嵌套所有FrameRows ,但是我需要滾動才能正常工作。

import * from Tkinter
import FrameRow
root = Tk()
root.title("Testing")

containerFrame =  Frame(root)
containerFrame.config(bg="red")
containerFrame.pack(side=TOP, fill=BOTH, expand=1)

# Frame showing proper behavior
a = Frame(containerFrame, bg="black")
a.pack(side=TOP, fill=X, expand=0)

btnLeft = Button(a)
btnLeft.config(text="LEFT")
btnLeft.pack(side=LEFT, fill=X, expand=1)

btnRight = Button(a)
btnRight.config(text="RIGHT")
btnRight.pack(side=RIGHT, fill=X, expand=0)


# Canvas
canvas = Canvas(containerFrame)
scrollbar = Scrollbar(containerFrame, orient=VERTICAL)

scrollbar.config(command=canvas.yview)
canvas.config(bg="blue", yscrollcommand=scrollbar.set)
scrollbar.pack(side=RIGHT, fill=Y)
canvas.pack(side=LEFT, fill=BOTH, expand=1)

# Multiple Frames within Canvas    
frameRow = range(30)
c = range(30)
for r in xrange(0,30):
    c[r] = Frame(canvas)
    c[r].config(bg="green")

    frameRow[r] = FrameRow.FrameRow()
    frameRow[r].setFrame(c[r])
    frameRow[r].setRow(r)
    frameRow[r].createRow()

    c[r].pack(side=TOP, fill=X, expand=1)
    canvas.create_window(0, (r+1)*30, window=c[r], anchor="nw")

canvas.config(scrollregion = canvas.bbox(ALL))

# OR
# Single Frame within Canvas
##c = Frame(canvas)
##c.config(bg="green")
##
##frameRow = range(30)
##for r in xrange(0,30):
##    frameRow[r] = FrameRow.FrameRow()
##    frameRow[r].setFrame(c)
##    frameRow[r].setRow(r)
##    frameRow[r].createRow()
##
##c.pack(side=TOP, fill=X, expand=1)
##canvas.create_window(0, 0, window=c, anchor="nw")

root.mainloop()

FrameRow類定義為:

from Tkinter import *

class FrameRow():
    _frame = "Default"
    _row = 0

    def setFrame(self, frame):
        self._frame = frame

    def setRow(self, row):
        self._row = row

    def createRow(self):
        self.frameRow = Frame(self._frame)
        self.frameRow.config(bg="yellow")
        self.frameRow.pack(side=TOP, fill=X, expand=1)

        self.btn1 = Button(self.frameRow)
        self.btn1.config(text="Button "+str(self._row)+"A")
        self.btn1.pack(side=LEFT, fill=X, expand=1)

        self.btn2 = Button(self.frameRow)
        self.btn2.config(text="Button "+str(self._row)+"B")
        self.btn2.pack(side=RIGHT, anchor=E, fill=X, expand=0)

使Frame c擴展到畫布的寬度時,我缺少什么嗎?

我在滾動和單個Frame c做錯什么了嗎?

是否有任何體面的教程或示例說明我應該如何做?

謝謝!

好像您都將窗口包裝在畫布中並創建了一個窗口對象。 老實說,我從來沒有做過,但我認為包裝沒有任何好處。

當您創建作為畫布中對象的窗口小部件時,它將不會展開以填充畫布。 您需要做的是為畫布的<Configure>事件創建一個綁定。 每當畫布更改大小(以及其他幾次)時,就會觸發此事件。 然后,您可以調整每個框架的大小以適合畫布的寬度。

既然您說您喜歡使用單個框架,將其他行嵌套在其中,那么這可能是最簡單的解決方案。 但是同樣,單個框架不會增長或縮小以適合畫布,您必須使用<Configure>綁定來完成。

請確保您配置畫布的scrollregion添加框架使用畫布 create_window 看來您忘記了在注釋掉的代碼中執行此操作,這肯定會阻止畫布滾動。

暫無
暫無

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

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