簡體   English   中英

如何使用 Canvas on/in/with Tkinter?

[英]How to use Canvas upon/in/with Tkinter?

我試圖在空白處繪制一個矩形,但是每次我用 Canvas 創建一些東西時,它都會向下移動所有按鈕(img 2)。 當我使用 Canvas 時,我不希望使用 tkinter 創建的按鈕移動,有什么辦法可以做到嗎?

圖像1

圖像2

代碼:

from tkinter import *
from functools import partial

colors = {
    0:"#ab91ff", 1:"#d0a176", 2:"#ecce86", 3:"#ecff91", 4:"#fff991", 5:"#92ff9f", 6:"#f991ff", 7:"#91dfff",
    8:"#d2ff91", 9:"#b8ff91"
}
buttonsPos = {
    "H":[1, 1, colors[0]], "He":[1, 18, colors[7]],

    "Li":[2, 1,  colors[1]], "Be":[2, 2, colors[2]], "B":[2, 13, colors[5]], "C":[2, 14, colors[0]], "N":[2, 15, colors[0]],
    "O":[2, 16, colors[0]], "F":[2, 17, colors[6]], "Ne":[2, 18, colors[7]],

    #more data...

}

DEFAULT_BOLD = ("Helvetica", "15", "bold")

class GUI():
    def __init__(self):
        self.root = Tk()
        self.root.geometry("900x414")
        self.root.iconbitmap("./icon.ico")
        self.root.title("Tabla periódica de los elementos")
        self.root.resizable(False, False)
        self.c = Canvas(self.root)
        self.c.pack()
        self.c.create_rectangle(50, 150, 250, 50, fill="pink")
        self.buttonsFrame = self.createFButtons()
        self.buttons = self.createButtons(self.buttonsFrame)


    def do(self):
        pass

    def createButtons(self, frame):
        bs = []
        for k,v in buttonsPos.items():
            b = Button(frame, command=partial(self.do, str(k)), text=str(k), font=DEFAULT_BOLD, height=1, width=3,
                       borderwidth=4, bg=v[2])
            b.grid(row=v[0], column=v[1], sticky=NSEW)
            bs.append(b)
        return bs

    def createFButtons(self):
        frame = Frame(self.root, bg="#ebebeb")
        frame.pack(fill="both", expand="True")
        return frame

    def loop(self):
        self.root.mainloop()

if __name__ == "__main__":
    c = GUI()
    c.loop()

您可以使用傳遞給Canvaspack參數:

self.c = Canvas(self.root)
self.c.pack(...)

另一種選擇是使用grid而不是pack ,但您應該修改整個代碼(因為gridpack不能在一起)。

您可以在此處找到有關 Tkinter 小部件的有用信息: https : //coderslegacy.com/python/python-gui/ 您可以在此處找到Canvas的快速指南: https : //coderslegacy.com/python/tkinter-canvas/

您正在創建畫布和按鈕框架是 2 個不同的小部件,並一個接一個地打包。 您不能在框架頂部創建任何矩形。 因此,在畫布中創建一個矩形會調整將按鈕框架向下推的畫布小部件的大小。

您可以使用帶有 place 命令的絕對定位在按鈕框架和位置內創建畫布。

from tkinter import *
from functools import partial

colors = {
    0:"#ab91ff", 1:"#d0a176", 2:"#ecce86", 3:"#ecff91", 4:"#fff991", 5:"#92ff9f", 6:"#f991ff", 7:"#91dfff",
    8:"#d2ff91", 9:"#b8ff91"
}
buttonsPos = {
    "H":[1, 1, colors[0]], "He":[1, 18, colors[7]],

    "Li":[2, 1,  colors[1]], "Be":[2, 2, colors[2]], "B":[2, 13, colors[5]], "C":[2, 14, colors[0]], "N":[2, 15, colors[0]],
    "O":[2, 16, colors[0]], "F":[2, 17, colors[6]], "Ne":[2, 18, colors[7]],

    #more data...

}

DEFAULT_BOLD = ("Helvetica", "15", "bold")

class GUI():
    def __init__(self):
        self.root = Tk()
        self.root.geometry("900x414")
        self.root.title("Tabla periódica de los elementos")
        self.root.resizable(False, False)
        self.buttonsFrame = self.createFButtons()
        self.buttons = self.createButtons(self.buttonsFrame)

        self.c = Canvas(self.buttonsFrame, width=150, height=50)
        self.c.place(x=100, y=0)
        self.c.create_rectangle(0, 100, 150, 0, fill="pink")

    def do(self):
        pass

    def createButtons(self, frame):
        bs = []
        for k,v in buttonsPos.items():
            b = Button(frame, command=partial(self.do, str(k)), text=str(k), font=DEFAULT_BOLD, height=1, width=3,
                       borderwidth=4, bg=v[2])
            b.grid(row=v[0], column=v[1], sticky=NSEW)
            bs.append(b)
        return bs

    def createFButtons(self):
        frame = Frame(self.root, bg="#ebebeb")
        frame.pack(fill="both", expand="True")
        return frame

    def loop(self):
        self.root.mainloop()

if __name__ == "__main__":
    c = GUI()
    c.loop()

暫無
暫無

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

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