You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何去除Tkinter中Frame与Canvas的边框

解决Tkinter中Canvas/Frame边框残留问题

你遇到的问题是Tkinter组件默认的高亮边框导致的——即使设置了borderwidth=0和bd=0,Canvas的highlightthickness属性默认值为1,会显示一圈不易察觉的高亮边框,这是你遗漏的关键设置。另外显式关闭Frame的高亮边框,可以彻底消除边缘痕迹。

具体修改步骤

  1. 给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)
  1. 给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()
  1. 让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:33:18