相关疑难解决方法(0)

为什么Tkinter中字符串像素的计算宽度和高度在平台之间有所不同?

我有一个Python脚本,需要计算以任意字体显示的任意字符串的确切大小,以生成简单的图表.我可以轻松地使用Tkinter.

import Tkinter as tk
import tkFont
root = tk.Tk()
canvas = tk.Canvas(root, width=300, height=200)
canvas.pack()
(x,y) = (5,5)
text = "yellow world"
fonts = []
for (family,size) in [("times",12),("times",24)]:
    font = tkFont.Font(family=family, size=size)
    (w,h) = (font.measure(text),font.metrics("linespace"))
    print "%s %s: (%s,%s)" % (family,size,w,h)
    canvas.create_rectangle(x,y,x+w,y+h)
    canvas.create_text(x,y,text=text,font=font,anchor=tk.NW)
    fonts.append(font) # save object from garbage collecting
    y += h+5
tk.mainloop()
Run Code Online (Sandbox Code Playgroud)

结果似乎取决于Python和/或系统的版本:

Python 2.5 Mac 0S X,时间12:(63,12),时间24:(128,24).Python 2.6 Mac OS X,时间12:(64,14),时间24:(127,27).Python 2.6中的Windows XP,12倍:(78,19),时间为24:(169,36)http://grab.by/grabs/d24a5035cce0d8032ea4e04cb8c85959.png

在Ned Batchelder提到它之后,我发现字体的大小因平台而异.只要你坚持与自己保持一致的Tkinter,它可能不是一个交易破坏者.但我的整个程序没有使用Tkinter的来执行实际的绘图:它只是依靠其字体大小计算,以产生一个输出(在SVG或Python脚本被发送到Nodebox).事情就是这样:

mocodo的输出http://grab.by/grabs/f67b951d092dd1f4f490e1469a53bca2.png

(请查看实际大小的 …

python size fonts cross-platform tkinter

30
推荐指数
3
解决办法
2万
查看次数

在python中将字符串转换为图像

我在一周前开始学习python,并希望编写一个小程序,将电子邮件转换为图像(.png),以便可以在论坛上共享它,而不会冒很多垃圾邮件的风险.

似乎python标准库不包含可以做到这一点的模块,但我发现它有一个PIL模块(PIL.ImageDraw).

我的问题是我似乎无法让它发挥作用.

基本上我的问题是:

  1. 如何在图像上绘制文本.
  2. 如何创建空白(白色)图像
  3. 有没有办法在没有实际创建文件的情况下执行此操作,以便在保存之前我可以在GUI中显示它?

谢谢你的帮助 :)

现行代码:

import Image
import ImageDraw
import ImageFont

def getSize(txt, font):
    testImg = Image.new('RGB', (1, 1))
    testDraw = ImageDraw.Draw(testImg)
    return testDraw.textsize(txt, font)

if __name__ == '__main__':

    fontname = "Arial.ttf"
    fontsize = 11   
    text = "example@gmail.com"

    colorText = "black"
    colorOutline = "red"
    colorBackground = "white"


    font = ImageFont.truetype(fontname, fontsize)
    width, height = getSize(text, font)
    img = Image.new('RGB', (width+4, height+4), colorBackground)
    d = ImageDraw.Draw(img)
    d.text((2, height/2), text, fill=colorText, font=font)
    d.rectangle((0, 0, width+3, height+3), outline=colorOutline) …
Run Code Online (Sandbox Code Playgroud)

python python-imaging-library

13
推荐指数
2
解决办法
4万
查看次数