【问题标题】:Borderwidth attribute in Tkinter not workingTkinter 中的 Borderwidth 属性不起作用
【发布时间】:2021-05-04 10:42:30
【问题描述】:

我正在尝试使用borderwidth属性仅突出显示png图像的“新游戏”部分,但是它不起作用,我该如何解决这个错误?

from tkinter import *
from PIL import ImageTk, Image

root = Tk()
root.iconbitmap('unnamed.ico')
root.title('2048')


bg = ImageTk.PhotoImage(Image.open("welcome.png"))
new_game_btn = ImageTk.PhotoImage(Image.open("image_40.png"))

my_canvas = Canvas(root, width=780, height=550)
my_canvas.pack()
my_canvas.create_image(0, 0, image=bg, anchor=NW)

button1 = Button(root, image=new_game_btn, borderwidth=00, relief=FLAT)
button1_window = my_canvas.create_window(100, 100, anchor=NW, window=button1)
root.mainloop()

【问题讨论】:

  • 你的borderwidth是borderwidth=00所以它是零。
  • 我看了一个 youtube 视频,他们说将零应用于边框宽度不会产生边框宽度,所以我想如果我也这样做,那么只会显示蓝色内部的部分,但它仍然尽管它是一个 png 文件,但显示了一些不需要的边框,如果这不是方法,那是什么?谢谢!
  • 我最初不明白你的问题。尝试从图像中移除背景(使其透明)。
  • 是的,前面的图片其实是透明的png图片,但是还是做了边框。

标签: python python-3.x tkinter tkinter-canvas


【解决方案1】:

您唯一的选择似乎是将图像绘制到画布而不是创建按钮(因为 Tkinter 中的小部件不支持透明度)。

缺点是,您必须检查画布上的鼠标坐标才能查看您的“按钮”是否已被点击。

代码如下所示:

from PIL import ImageTk, Image

root = Tk()
root.iconbitmap('unnamed.ico')
root.title('2048')

bg = ImageTk.PhotoImage(Image.open("welcome.png"))
new_game_btn = ImageTk.PhotoImage(Image.open("image_40.png"))

my_canvas = Canvas(root, width=780, height=550)
my_canvas.pack()
my_canvas.create_image(0, 0, image=bg, anchor=NW)

my_canvas.create_image(100, 100, image=new_game_btn, anchor=NW)

root.mainloop()

这导致(不要介意错字...):

如果你想检查画布的那部分是否被点击,我会像这样检查边界框:

from tkinter import *
from PIL import ImageTk, Image

x_pos = 100
y_pos = 100
width = 100
height = 100

def callback(event):
    print("Canvas clicked at", event.x, event.y)
    if (event.x > x_pos and event.x < x_pos + width):
        if(event.y > y_pos and event.y < y_pos + height):
            print("The button was clicked (approximately).")

root = Tk()
root.iconbitmap('unnamed.ico')
root.title('2048')

bg = ImageTk.PhotoImage(Image.open("welcome.png"))
new_game_btn = ImageTk.PhotoImage(Image.open("image_40.png"))

my_canvas = Canvas(root, width=780, height=550)
my_canvas.pack()
my_canvas.create_image(0, 0, image=bg, anchor=NW)

my_canvas.create_image(100, 100, image=new_game_btn, anchor=NW)
my_canvas.bind("<Button-1>", callback)

root.mainloop()

【讨论】:

  • 您可以在图像项上使用tag_bind(),而不是在画布上绑定。
  • 嘿,@frankenaaps,我知道您建议将画布的那部分用作按钮,就像如果在窗口中的某个范围内被光标单击然后它会显示“按钮被点击(大约)。”,我的问题是我需要在上面的程序中更改哪些尺寸才能解决这个问题?
  • 这取决于您的图像以及将其放置在画布上的位置。如果您只需要一个近似按钮(例如图像的外部尺寸)就可以了,您也可以使用@acw1668 的方法,无需设置按钮的坐标和大小。但是,如果您想更精确地检查,您也可以使用圆形或椭圆形作为边界框。
猜你喜欢
  • 2022-01-25
  • 2016-02-06
  • 1970-01-01
  • 2011-03-31
  • 2018-11-19
  • 2012-07-23
  • 2016-07-16
  • 2020-01-24
  • 2015-09-05
相关资源
最近更新 更多