13

Frame を作成してから Canvas を作成しました。
次にやりたいことは、Canvas に Button を追加することです。
ただし、ボタンをパックすると、キャンバスが表示されません!

これが私が試したものです:

from Tkinter import Tk, Canvas, Frame, Button
from Tkinter import BOTH, W, NW, SUNKEN, TOP, X, FLAT, LEFT

class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("Layout Test")
        self.config(bg = '#F0F0F0')
        self.pack(fill = BOTH, expand = 1)
                #create canvas
        canvas1 = Canvas(self, relief = FLAT, background = "#D2D2D2",
                                            width = 180, height = 500)
        canvas1.pack(side = TOP, anchor = NW, padx = 10, pady = 10)
        #add quit button
        button1 = Button(canvas1, text = "Quit", command = self.quit,
                                                            anchor = W)
        button1.configure(width = 10, activebackground = "#33B5E5",
                                                        relief = FLAT)
        button1.pack(side = TOP)

def main():
    root = Tk()
    root.geometry('800x600+10+50')
    app = Example(root)
    app.mainloop()

if __name__ == '__main__':
    main()
4

3 に答える 3

18

Tkinterpackマネージャーは、親ウィジェットのサイズを正しいサイズに変更して、子ウィジェットを含めようとします。デフォルトでは、それより大きくなることはありません。つまり、キャンバスはそこにありますが、ボタンとまったく同じサイズであるため、見えません。

キャンバスのサイズを動的に変更せずにウィジェットをキャンバスに配置する場合は、次のCanvas.create_window()関数が必要です。

# ... snip ...
button1 = Button(self, text = "Quit", command = self.quit, anchor = W)
button1.configure(width = 10, activebackground = "#33B5E5", relief = FLAT)
button1_window = canvas1.create_window(10, 10, anchor=NW, window=button1)

(10, 10)これにより、キャンバス自体のサイズを変更せずに、キャンバスを基準にして左上隅にボタンが作成されます。

window引数を他のTkinterウィジェットへの参照に置き換えることができることに注意してください。ただし、注意点が1つあります。名前付きウィジェットは、キャンバスを含むトップレベルウィンドウの子、または同じトップレベルウィンドウにあるウィジェットの子である必要があります。

于 2012-08-16T05:34:34.643 に答える