如何去除Tkinter中Frame与Canvas的边框
解决Tkinter中Canvas/Frame边框残留问题
你遇到的问题是Tkinter组件默认的高亮边框导致的——即使设置了borderwidth=0和bd=0,Canvas的highlightthickness属性默认值为1,会显示一圈不易察觉的高亮边框,这是你遗漏的关键设置。另外显式关闭Frame的高亮边框,可以彻底消除边缘痕迹。
具体修改步骤
- 给Canvas添加
highlightthickness=0:这个属性控制组件的高亮边框,即使组件未获得焦点,默认也会有1像素的痕迹。修改Cell类的start_canvas方法:
def start_canvas(self): self.canv=tk.Canvas(self,width=80,height=80,bg=WOODEN,bd=0, highlightthickness=0)
- 给Frame添加
highlightthickness=0:虽然Frame默认highlightthickness为0,但显式设置可以避免环境差异带来的意外,修改Cell类的初始化方法:
def __init__(self,master,height,BG): super().__init__(master=master,width=80,height=height,bg=BG,borderwidth=0, highlightthickness=0) self.amount=0 self.start_canvas() self.redraw()
- 让Canvas填充整个Frame:默认
pack()会让Canvas居中,可能导致Frame背景露出,修改redraw方法的pack参数:
def redraw(self): self.canv.pack(fill="both", expand=True)
Replit环境的影响
Replit的在线Tkinter环境和本地环境基本一致,不会因为排版问题导致边框残留,上述修改在Replit中同样生效。
修改后的完整代码
import tkinter as tk from tkinter import messagebox as m WOODEN="#BA8C63" PALE_BLUE="#CDF5F6" PALE_YELLOW="#EFF9DA" PALE_RED="#F9D8D6" PALE_GREEN="#DDF0C7" PALE_PINK="#D6CDEA" class Game(tk.Tk): def __init__(self): super().__init__() self.geometry("975x210") self.configure(bg=WOODEN) self.resizable(False, False) self.title("Mancala") self.P1pits={"Bank":Bank(self,"P1"),"Pits":[Pit(self,"P1",i) for i in range(1,9)]} self.P2pits={"Bank":Bank(self,"P2"),"Pits":[Pit(self,"P2",i) for i in range (1,9)]} self.mainloop() class Cell(tk.Frame): def __init__(self,master,height,BG): super().__init__(master=master,width=80,height=height,bg=BG,borderwidth=0, highlightthickness=0) self.amount=0 self.start_canvas() self.redraw() def start_canvas(self): self.canv=tk.Canvas(self,width=80,height=80,bg=WOODEN,bd=0, highlightthickness=0) def redraw(self): self.canv.pack(fill="both", expand=True) class Bank(Cell): def __init__(self,master,player): super().__init__(master,148,WOODEN) self.player=player self.counters=[] self.enlarge_canvas() self.add_pot() if player == "P1": self.grid(row=0,column=9,rowspan=2,pady=(7,10),padx=(10,15)) else: self.grid(row=0,column=0,rowspan=2,pady=(10,7),padx=(15,10)) def enlarge_canvas(self): self.canv.configure(height=180) def add_pot(self): self.p1=self.canv.create_arc((2,2,78,78),start=0,extent=180) self.p2=self.canv.create_arc((2,102,78,178),start=180,extent=180) self.p3=self.canv.create_line(2,40,78,40,fill=WOODEN) self.p4=self.canv.create_line(2,140,78,140,fill=WOODEN) self.p5=self.canv.create_line(2,40,2,140) self.p6=self.canv.create_line(78,40,78,140) class Pit(Cell): def __init__(self,master,player,index): super().__init__(master,80,WOODEN) self.amount=6 self.counters=[] self.add_pot() if player == "P1": self.grid(row=1,column=index,pady=(7,12),padx=4) else: self.grid(row=0,column=9-index,pady=(12,7),padx=4) def add_pot(self): self.p1=self.canv.create_oval(1,1,79,79) def again(val): global window window.destroy() if val: window = Game() if __name__ == "__main__": window = Game()
内容的提问来源于stack exchange,提问作者Shaken not Stirred
相关产品推荐
相关产品推荐

