GVKun编程网logo

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

4

如果您想了解为什么在Tkinter中计算的字符串宽度和高度的相关知识,那么本文是一篇不可错过的文章,我们将对以像素为单位在平台之间有所不同?进行全面详尽的解释,并且为您提供关于ActionBar的大小

如果您想了解为什么在Tkinter中计算的字符串宽度和高度的相关知识,那么本文是一篇不可错过的文章,我们将对以像素为单位在平台之间有所不同?进行全面详尽的解释,并且为您提供关于ActionBar 的大小(以像素为单位)是多少?、actionscript-3 – 字符串的长度(以像素为单位)、ASP.NET c#获取屏幕宽度(以像素为单位)、CSS宽度100%或最大宽度(以像素为单位)的有价值的信息。

本文目录一览:

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

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

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

import Tkinter as tkimport tkFontroot = 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+5tk.mainloop()

结果似乎取决于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

(请查看实际尺寸的图像。请注意,用于这些输出的主要字体不是Times,而是Trebuchet
MS。)

我现在怀疑Tkinter无法避免这种差异。您会推荐其他哪些跨平台解决方案?

答案1

小编典典

你有两个问题。让我们一次解决他们

1:在相同平台上使用相同字体的python 2.5和2.6之间的区别

这两个版本的python使用不同版本的tk。在我的Mac电脑上,2.5使用tk版本8.4.19,而2.6使用8.5.7。在tk的8.5.2版中,对tk的字体测量功能进行了一些更改。假定这些更改是改进,我认为可以肯定地认为从python
2.6获得的数字比从2.5获得的数字更准确。

2:Mac上的python 2.6与PC上的2.6之间的区别。

显然,从您包括的屏幕截图中,PC使用的是更大的字体,因此您获得的数字更大。问题是,为什么?您以磅(1/72英寸)为单位指定字体大小。为了让Tk(或任何渲染系统)渲染字体,它需要知道实际显示器上一英寸有多少像素。这在不同的系统上会有所不同,并且底层操作系统不一定总是为Tk提供准确的数字来进行计算。

从历史上看,无论实际显示什么,Apple和Microsoft都将72ppi和96ppi标准化,因此数字总是会有所不同。有关Mac和Windows在计算像素密度方面的差异的更多信息,请参阅Wikipedia上的“每英寸点数”文章。

您可以尝试通过以像素而不是点为单位指定字体来解决此问题。您可以通过使用负数来表示字体大小。

最后,您可能会添加到小示例代码中的一件事是打印出font.actual()命令的结果-
您可能会在Windows和Mac框之间看到一些不同之处,这将解释那里的区别。这可以准确告诉您Tk正在使用哪种字体。

ActionBar 的大小(以像素为单位)是多少?

ActionBar 的大小(以像素为单位)是多少?

我需要知道 ActionBar 的确切大小(以像素为单位),以便应用正确的背景图像。

答案1

小编典典

要在 XML 中检索 ActionBar 的高度,只需使用

?android:attr/actionBarSize

或者如果您是 ActionBarSherlock 或 AppCompat 用户,请使用此

?attr/actionBarSize

如果您在运行时需要此值,请使用此

final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(                    new int[] { android.R.attr.actionBarSize });mActionBarSize = (int) styledAttributes.getDimension(0, 0);styledAttributes.recycle();

如果您需要了解这是在哪里定义的:

  1. 属性名称本身在平台的/res/values/attrs.xml中定义
  2. 平台的themes.xml选择此属性并为其分配一个值。
  3. 步骤2中分配的值取决于不同的设备大小,在平台的各种dimens.xml文件中定义,即。 核心/res/res/values-sw600dp/dimens.xml

actionscript-3 – 字符串的长度(以像素为单位)

actionscript-3 – 字符串的长度(以像素为单位)

我正在使用arrayCollection字符串填充dropDownList.我希望下拉列表控件的宽度与数组集合中最长字符串的大小(以像素为单位)匹配.我面临的问题是:集合中字符串的字体宽度不同,例如: ‘W’看起来比’l’宽.所以我估计一个字符的宽度是8像素,但这不是很整洁.如果遇到具有许多“W”和“M”的字符串,则估计是错误的.所以我想要精确的字符串像素宽度.如何获得字符串的确切长度(以像素为单位)?

我的解决方案是将所有字符估计为8像素宽,如下所示:

public function populateDropDownList():void{
    var array:Array = new Array("o","two","three four five six seven eight wwww");
    var sampleArrayCollection:ArrayCollection = new ArrayCollection(array);
    var customDropDownList:DropDownList = new DropDownList();
    customDropDownList.dataProvider=sampleArrayCollection;
    customDropDownList.prompt="Select ...";
    customDropDownList.labelField="Answer Options:";
    //calculating the max width
    var componentWidth=10; //default
    for each(var answerText in array){
     Alert.show("Txt size: "+ answerText.length + " pixels: " + answerText.length*9); 
     if(answerText.length * 8 > componentWidth){
      componentWidth=answerText.length * 8;
     }
    }
    customDropDownList.width=componentWidth;
    answers.addChild(customDropDownList);
   }

任何想法或解决方案都很受重视.

谢谢

解决方法

要获得更准确的度量,可以使用字符串填充TextField,然后测量该TextField文本的宽度.

码:

function measureString(str:String,format:textformat):Rectangle {
    var textField:TextField = new TextField();
    textField.defaulttextformat = format;
    textField.text = str;

    return new Rectangle(0,textField.textWidth,textField.textHeight);
}

用法:

var format:textformat = new textformat();
format.font = "Times New Roman";
format.size = 16;

var strings:Array = [ "a","giraffe","foo","!" ];

var calculatedWidth:Number = 50;    // Set this to minimum width to start with

for each (var str:String in strings) {
    var stringWidth:Number = measureString(str,format).width;
    if (stringWidth > calculatedWidth) {
        calculatedWidth = stringWidth;
    }
}

trace(calculatedWidth);

ASP.NET c#获取屏幕宽度(以像素为单位)

ASP.NET c#获取屏幕宽度(以像素为单位)

我试图以像素为单位检索浏览器的宽度但由于某种原因我回到了640,我的分辨率为1240.

我正在使用的代码是Request.browser.ScreenPixelsWidth

有没有人知道为什么它总是返回640或者是否有另一种方式让我在页面加载时获得浏览器的宽度?

解决方法

您需要使用 Javascript填充隐藏字段(请参阅 this question以了解如何执行此操作),然后将该字段发送回服务器,以便在ASP.NET中可以使用它.

ASP.NET无法直接读取详细的浏览器信息(您正在讨论从客户端浏览器向托管应用程序的ASP.NET服务器发送一些非常具体的信息,并且执行时涉及到很多问题类似的东西).

看到这个相似但不太详细的问题:

Asp.Net Get Screen Width

CSS宽度100%或最大宽度(以像素为单位)

CSS宽度100%或最大宽度(以像素为单位)

如何可以创建宽度的CSS规则

>默认使用100%宽度
>如果100%宽度超过某个像素宽度(假设为512像素),则宽度被压缩到此像素宽度

我不知道宽度和最大宽度的关系,或如何calc()被支持或可以表达这一点。这需要使用最新的WebKit浏览器和Firefox 4. IE8等支持不需要

解决方法

这实际上是 max-width的预期用途。如果元素的计算(实际)宽度超过max-width,它将被限制为最大值,而不是超过它。百分比与像素不相关。

在这样的规则中声明两者(不需要calc()函数):

#somediv {
    width: 100%;
    max-width: 512px;
}

关于为什么在Tkinter中计算的字符串宽度和高度以像素为单位在平台之间有所不同?的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于ActionBar 的大小(以像素为单位)是多少?、actionscript-3 – 字符串的长度(以像素为单位)、ASP.NET c#获取屏幕宽度(以像素为单位)、CSS宽度100%或最大宽度(以像素为单位)的相关知识,请在本站寻找。

本文标签: