我如何使用 Canvas upon/in/with Tkinter?
How can I use Canvas upon/in/with Tkinter?
我试图在空白 space 上绘制一个矩形,但每次我使用 Canvas 创建内容时,它都会向下移动所有按钮(图 2)。我不希望用 Tkinter 创建的按钮在我使用 Canvas 时移动。有什么办法可以做到吗?
Image 1
Image 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()
您可以使用传递给 Canvas
的 pack
个参数:
self.c = Canvas(self.root)
self.c.pack(...)
另一种选择是使用 grid
而不是 pack
,但您应该修改整个代码(因为 grid
和 pack
不能在一起)。
您可以在此处找到有关 Tkinter 小部件的有用信息:Python GUI with Tkinter. You can find a quick guide of Canvas
here: Python Tkinter Canvas.
您正在创建一个 canvas 和一个按钮框架。它们是两个不同的小部件,一个接一个地打包。您不能在框架顶部创建任何矩形。因此,在 canvas 中创建一个矩形会调整将按钮框架向下推的 canvas 小部件的大小。
您可以通过 place 命令使用绝对定位在按钮的框架和位置内创建 canvas。
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()
我试图在空白 space 上绘制一个矩形,但每次我使用 Canvas 创建内容时,它都会向下移动所有按钮(图 2)。我不希望用 Tkinter 创建的按钮在我使用 Canvas 时移动。有什么办法可以做到吗?
Image 1
Image 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()
您可以使用传递给 Canvas
的 pack
个参数:
self.c = Canvas(self.root)
self.c.pack(...)
另一种选择是使用 grid
而不是 pack
,但您应该修改整个代码(因为 grid
和 pack
不能在一起)。
您可以在此处找到有关 Tkinter 小部件的有用信息:Python GUI with Tkinter. You can find a quick guide of Canvas
here: Python Tkinter Canvas.
您正在创建一个 canvas 和一个按钮框架。它们是两个不同的小部件,一个接一个地打包。您不能在框架顶部创建任何矩形。因此,在 canvas 中创建一个矩形会调整将按钮框架向下推的 canvas 小部件的大小。
您可以通过 place 命令使用绝对定位在按钮的框架和位置内创建 canvas。
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()