24

だから私はtkinterでキャンバスウィジェットを使って、スクロールバーを持つラベルでいっぱいのフレームを作成してきました。フレームがその中に配置されたラベルのサイズにのみ拡大することを除いて、すべてがうまく機能しています-フレームを親キャンバスのサイズに拡大したい.

これは、キャンバスのフレームに pack(expand = True) (以下のコードでコメントアウトしています) を使用すると簡単に実行できますが、スクロールバーが機能しません。

適切なコードは次のとおりです。

    ...
    self.canvas = Canvas(frame, bg = 'pink')
    self.canvas.pack(side = RIGHT, fill = BOTH, expand = True)

    self.mailbox_frame = Frame(self.canvas, bg = 'purple')

    self.canvas.create_window((0,0),window=self.mailbox_frame, anchor = NW)

    #self.mailbox_frame.pack(side = LEFT, fill = BOTH, expand = True)

    mail_scroll = Scrollbar(self.canvas, orient = "vertical",
        command = self.canvas.yview)
    mail_scroll.pack(side = RIGHT, fill = Y)

    self.canvas.config(yscrollcommand = mail_scroll.set)

    self.mailbox_frame.bind("<Configure>", self.OnFrameConfigure)


def OnFrameConfigure(self, event):
    self.canvas.configure(scrollregion=self.canvas.bbox("all"))

また、フレームに色を付けた画像も用意しました。ピンクの領域は、mailbox_frame で塗りつぶす必要があるキャンバスです (右側にスクロールバーが表示されます)。

4

3 に答える 3

36

他の誰かが知る必要がある場合の将来の参考のために:

        frame = Frame(self.bottom_frame)
        frame.pack(side = LEFT, fill = BOTH, expand = True, padx = 10, pady = 10)

        self.canvas = Canvas(frame, bg = 'pink')
        self.canvas.pack(side = RIGHT, fill = BOTH, expand = True)

        self.mailbox_frame = Frame(self.canvas, bg = 'purple')

        self.canvas_frame = self.canvas.create_window((0,0),
            window=self.mailbox_frame, anchor = NW)
        #self.mailbox_frame.pack(side = LEFT, fill = BOTH, expand = True)

        mail_scroll = Scrollbar(self.canvas, orient = "vertical", 
            command = self.canvas.yview)
        mail_scroll.pack(side = RIGHT, fill = Y)

        self.canvas.config(yscrollcommand = mail_scroll.set)

        self.mailbox_frame.bind("<Configure>", self.OnFrameConfigure)
        self.canvas.bind('<Configure>', self.FrameWidth)

    def FrameWidth(self, event):
        canvas_width = event.width
        self.canvas.itemconfig(self.canvas_frame, width = canvas_width)

    def OnFrameConfigure(self, event):
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))
于 2015-03-28T20:49:00.800 に答える
18

<Configure>キャンバスのサイズが変わるたびに発生するキャンバス イベントにバインドを設定します。イベント オブジェクトからキャンバスの幅と高さを取得し、それを使用してフレームのサイズを変更できます。

于 2015-03-28T17:01:22.577 に答える