tkinter Message 小部件的 relief 选项失效
我正在用Python创建一个扫雷游戏的图形界面,但我在选择用Label还是Message小部件来做游戏的方块时有点犹豫。我想给每个方块应用一个叫做'RAISED'的效果,但这个效果在Message小部件上不起作用。不过,如果我用Label小部件,方块里的数字就不能居中显示,尽管我用了对齐选项,但'RAISED'效果是可以的。我该如何在Message小部件中使用'RAISED'效果?如果不行,那我该如何让Label小部件里的文字居中呢?这是我目前的代码:
import random
try: # ensures usage of best GUI package on computer
from tkinter import Tk
from tkinter import Message
from tkinter.ttk import *
except ImportError:
from tkinter import *
class Board:
def __init__(self, width, height, numBombs):
self.width = width
self.height = height
self.bombs = numBombs
self.boxlist = []
for i in range(width * height):
a = Message(relief = 'raised', justify = 'center')
a.grid(column = (i + 1) % width, row = (i + 1) // width, ipadx = 15, ipady = 5)
if i == width * height - 1:
a.grid(row = 0, column = 0, ipadx = 15, ipady = 5)
a.bind('<Button-1>', self.reveal)
self.boxlist.append(a)
self.reallist = ['0'] * width * height
def reveal(self, event):
event.widget['text'] = self.reallist[self.boxlist.index(event.widget)]
a = Board(5, 6, 10)
2 个回答
2
我觉得这个可能是有效的,但你没有把边框的宽度调大,所以看不出来。试试这个,看看效果明显一些:
import tkinter
from tkinter import Message
from tkinter import Frame
tk = tkinter.Tk()
root = tk
Frame1 = Frame(root, borderwidth= 50)
Frame1.grid()
mymessage=Message (Frame1, relief='raised',anchor='center', text="test", bd=20)
mymessage.grid(padx= 20, pady= 20)
root.mainloop()
0
justify= 这个选项用来定义多行文本的对齐方式。你可以选择左对齐(LEFT)、右对齐(RIGHT)或者居中对齐(CENTER)。需要注意的是,如果你想把文本放在小部件内部的某个位置,要用到anchor选项。 默认情况下是居中对齐(CENTER)。(justify/Justify)
justify并不会改变文本在标签中的位置,改变位置的是anchor选项,默认也是居中对齐,但如果你的文本还是没有居中,那是为什么呢?
当你创建一个标签时,如果没有明确指定它的宽度(比如用width="X"),那么这个标签的宽度就会和文本的长度一样,所以文本就没有地方可以移动。
如果你设置一个比文本长度更大的自定义宽度,你会发现文本现在是居中的了。
假设'|'是标签的边界:
ttk.Label(root, text="hello world")
|hello world|
ttk.Label(root, text="hello world", width=17)
| hello world |