我正在尝试在窗口中放置一个标签(包括一些文字+ 1 个图像)。作为学习过程,我还使用标签内的“浮雕”选项在标签周围放置一个漂亮的边框。
但是这种“缓解”似乎并没有达到预期效果:
如果我使用 RAISED 或 SUNKEN 作为“浮雕”选项,则窗口仅显示边框,但不显示标签(无文本,无图像)。
如果我使用 GROOVE 或 RIDGE 作为“浮雕”选项,则标签(文本+图像)都会完美显示。
有关我的软件版本的快速信息:
=> OS: macOS Catalina 10.15.7
=> IDE: PyCharm CE
=> Python version: 3.12.5
=> tkinter Tcl version: 8.6 (from importing tkinter and using: print(tkinter.TclVersion))
以下是我的代码。里面东西太少了
# ===================================================================
# imports and version checking
from tkinter import *
import tkinter
import sys
print(sys.version)
print(tkinter.TclVersion)
# create a window
window = Tk()
# prepping image to add to label; just some random picture I had laying around
photo = PhotoImage(file='Avatar - bkgnd.png').subsample(4,4)
# create a label, args: container (which is window in this case), and the text option
label = Label(window,
text="Hello",
font=("TkDefaultFont",40,"bold","underline"),
fg='#00ff00',
bg='black',
relief=RAISED, # This option is causing problems; SUNKEN, RAISED, do not work; GROOVE, RIDGE work.
bd=10,
padx=20, pady=20,
image=photo,
compound=CENTER)
# add label to window
label.pack()
# display the window
window.mainloop()
# ===================================================================
在我的研究中,我遇到了 tkinter 的潜在 macOS 问题,包括 Stack Overflow 上的几个问题和答案,但没有找到解决方案。
您对我如何解决我的问题有什么建议吗?
它一定很简单,但我就是看不到它,这让我发疯。
感谢 Discord 上的 @cratermoon,他帮助我找到了有效的解决方法。解决方法是在标签周围放置一个框架。
最初对我来说听起来很复杂,但实施起来并不困难,即使对于我作为各个方面的初学者来说也是如此。基本上就像: 窗口环绕框架 -> 框架环绕标签
所以就我而言,我成功地实现了如下:
# ===================================================================
# create a window
window = Tk()
# prepping image to add to label; just some random picture I had laying around
photo = PhotoImage(file='Avatar - bkgnd.png').subsample(4,4)
# CROSS-PLATFORM COMPATIBILITY:
# -----------------------------
# tcl for macOS Catalina is faulty -- relief doesn't work in label; must do "relief"
# in frame. So like: window wrapping around frame, frame wrapping around label.
# ("tkmacosx" is good for buttons only; it has no Label.)
frame = Frame(window, relief=SUNKEN, bd=10) # Doing "relief" and "bd" options in frame,
frame.pack() # instead of in label.
# Create label. However, the "master" argument becomes "frame", as we're
# wrapping the frame around the label.
label = Label(frame,
text="Hello",
font=("TkDefaultFont",40,"bold","underline"),
fg='#00ff00',
bg='black',
#relief=SUNKEN, # Doing "relief" option in frame instead of here in label
#bd=10, # Doing "bd" option in frame instead of here in label
padx=20, pady=20,
image=photo,
compound=CENTER)
label.pack() # Packing label into frame
# display the window
window.mainloop()
# ===================================================================