Python -- tkinter 窗口标签在启用“救济”选项时无法正确显示

问题描述 投票:0回答:1

我正在尝试在窗口中放置一个标签(包括一些文字+ 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 上的几个问题和答案,但没有找到解决方案。

您对我如何解决我的问题有什么建议吗?

它一定很简单,但我就是看不到它,这让我发疯。

python macos tkinter label window
1个回答
0
投票

感谢 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()
# ===================================================================
© www.soinside.com 2019 - 2024. All rights reserved.