Как сделать текст переменной жирным шрифтом в Tkinter? - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть сценарий, в котором я хотел бы выделить текст, который присутствует внутри переменной в Tkinter.

Код выглядит следующим образом:

best_batsmen = dataset.loc[dataset.loc[dataset['Innings']>=15,'Average'].idxmax(),'Names']
message = ("The best Batsman of the Tournament could possibly be: " + best_batsmen)
canvas_width = 500
canvas_height = 500
root = Toplevel()
root.geometry("700x600")
root.title("Best Batsman")
canvas = Canvas(root, width=canvas_width, height=canvas_height)
canvas.create_text(1, 10, anchor=W, text=message)
img = ImageTk.PhotoImage(Image.open("virat.jpeg"))
canvas.create_image(0, 20, anchor=NW, image=img)
canvas.image = img
canvas.pack()
root.mainloop()

В приведенном выше коде я хотел бы выделять только текст, присутствующий внутри переменной best_batsmen, используя Tkinter. Может кто-нибудь, пожалуйста, помогите мне разобраться в этом.

Ответы [ 3 ]

3 голосов
/ 29 апреля 2019

Вы должны использовать второй create_text, чтобы поместить только текст best_batsman с font='bold'

canvas.create_text(1, 10, anchor='w', text=message)
canvas.create_text(380, 10, anchor='w', text=best_batsmen, font='bold')

, но вы должны вручную вычислить x позицию для best_batsmen (то есть. 380)

import tkinter as tk
from PIL import Image, ImageTk

best_batsmen = "James Bond"
message = "The best Batsman of the Tournament could possibly be: "

canvas_width = 500
canvas_height = 500

root = tk.Tk()

canvas = tk.Canvas(root, width=canvas_width, height=canvas_height)
canvas.pack()

canvas.create_text(1, 10, anchor='w', text=message)
canvas.create_text(380, 10, anchor='w', text=best_batsmen, font='bold')

img = ImageTk.PhotoImage(Image.open("virat.jpeg"))
canvas.create_image(0, 20, anchor='nw', image=img)
#canvas.image = img

root.mainloop()

В конце концов вы можете попытаться вычислить позицию с помощью tkinter.font.Font().measure()

import tkinter.font as tkfont

#width = tkfont.Font(family='arial', size=20, weight='normal').measure(message)
width = tkfont.Font().measure(message)
canvas.create_text(width, 10, anchor='w', text=best_batsmen, font='bold')

Если вы поместите текст над изображением, чтобы вам не нужен текст с прозрачным фономзатем вы можете поместить Frame, используя pack(), и поместить два Labels в Frame, используя pack(side='left')

frame = tk.Frame(root)
frame.pack()

tk.Label(frame, text=message).pack(side='left')
tk.Label(frame, text=best_batsmen, font='bold').pack(side='left')

Таким образом, вам не нужно вычислять x позицию для best_batsmen

И вы можете поместить изображение в положение (0, 0)

import tkinter as tk
from PIL import Image, ImageTk

best_batsmen = "James Bond"
message = "The best Batsman of the Tournament could possibly be: "

canvas_width = 500
canvas_height = 500

root = tk.Tk()

frame = tk.Frame(root)

tk.Label(frame, text=message).pack(side='left')
tk.Label(frame, text=best_batsmen, font='bold').pack(side='left')
frame.pack()

canvas = tk.Canvas(root, width=canvas_width, height=canvas_height)
canvas.pack()

img = ImageTk.PhotoImage(Image.open("virat.jpeg"))
canvas.create_image(0, 0, anchor='nw', image=img)
#canvas.image = img

root.mainloop()

Или вы можете использовать create_window(..., window=frame), чтобы поместить его на холст.Вы должны сделать это после создания Canvas.

frame = tk.Frame(root)
canvas.create_window(0, 0, window=frame, anchor='nw')

tk.Label(frame, text=message).pack(side='left')
tk.Label(frame, text=best_batsmen, font='bold').pack(side='left')

Если вы хотите нанести изображение - не выше - вам придется использовать creat_window после create_image.Но виджеты (Frame, «Метка» и т. Д.) Не могут иметь прозрачного фона.

import tkinter as tk
from PIL import Image, ImageTk
import tkinter.font as tkfont

best_batsmen = "James Bond"
message = "The best Batsman of the Tournament could possibly be: "

canvas_width = 500
canvas_height = 500

root = tk.Tk()

canvas = tk.Canvas(root, width=canvas_width, height=canvas_height)
canvas.pack()

frame = tk.Frame(root)
canvas.create_window(1, 0, window=frame, anchor='nw')

tk.Label(frame, text=message).pack(side='left')
tk.Label(frame, text=best_batsmen, font='bold').pack(side='left')

img = ImageTk.PhotoImage(Image.open("virat.jpeg"))
canvas.create_image(0, 20, anchor='nw', image=img)
#canvas.image = img

root.mainloop()

Вместо Frame с Labels вы можете использовать Text с тегами с назначенными цветами и весом.

1 голос
/ 29 апреля 2019

Вы можете создать текст на холсте и отредактировать его стили шрифтов.

canvas.create_text(1, 10, font=('arial', 20, BOLD), text='your text here')

Для этого вам придется импортировать стиль из шрифтов tkinter.

from tkinter.font import BOLD
0 голосов
/ 30 апреля 2019

Вы можете разделить сообщение на 2 части:

best_batsmen = 'Virat Kohli'
message = 'The best Batsman of the Tournament could possibly be: '

Затем нарисуйте первую часть как обычно:

msg = canvas.create_text(1, 10, text=message, anchor=W)

Используйте возвращенный идентификатор элемента msg, чтобы получить ограничениеполе и шрифт для message:

bbox = canvas.bbox(msg) # get the message bounding box
# import tkinter.font as tkfont
font = tkfont.Font(font=canvas.itemcget(msg, 'font')) # get the message font

Затем установите вес шрифта на полужирный шрифт и нарисуйте вторую часть в конце первой, используя жирный шрифт:

font['weight'] = 'bold' # change font weight to bold
# show best_batsmen at the end of the message with bold style
canvas.create_text(bbox[2], bbox[1], text=best_batsmen, font=font, anchor=NW)
...