2010-05-27 10 views
27

मेरे पास एक पायथन स्क्रिप्ट है जिसे सरल आरेख उत्पन्न करने के लिए मनमाने ढंग से फ़ॉन्ट्स में प्रदर्शित मनमानी तारों के सटीक आकार की गणना करने की आवश्यकता है। मैं आसानी से टिंकर के साथ कर सकता हूं।Tkinter में एक स्ट्रिंग के पिक्सेल में गणना की चौड़ाई और ऊंचाई प्लेटफॉर्म के बीच भिन्न क्यों होती है?

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

बाद नेड Batchelder यह उल्लेख किया है, मुझे पता चला कि फोंट का आकार मंच से मंच के लिए अलग है:

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() 

परिणाम अजगर और/या सिस्टम के संस्करण पर निर्भर करने लगते हैं । यह तब तक एक सौदा ब्रेकर नहीं हो सकता है जब तक आप टिंकर के साथ चिपके रहते हैं, जो स्वयं के साथ संगत रहता है। लेकिन मेरे complete program वास्तविक ड्राइंग करने के लिए टिंकर का उपयोग नहीं करते हैं: यह केवल आउटपुट उत्पन्न करने के लिए अपने फ़ॉन्ट आकार की गणना पर निर्भर करता है (एसवीजी में या पाइथन स्क्रिप्ट के रूप में Nodebox पर भेजा जाना चाहिए)। और यह वहाँ चीजें वास्तव में गलत है कि है:

Output of mocodo http://grab.by/grabs/f67b951d092dd1f4f490e1469a53bca2.png

(।। कृपया image in real size को देखो ध्यान दें कि मुख्य इन outputs के लिए प्रयुक्त फ़ॉन्ट टाइम्स नहीं है, लेकिन Trebuchet MS)

अब मुझे लगता है कि इस तरह की विसंगतियों को टिंकर से बचा नहीं जा सकता है। आप किस अन्य क्रॉस-प्लेटफ़ॉर्म समाधान की सिफारिश करेंगे?

+1

आप इन फ़ॉन्ट में पाठ का स्क्रीनशॉट लेने, और उन्हें मान आप हो रही है के साथ तुलना किया था:

यह आउटपुट की एक तस्वीर है? –

+0

मुझे नहीं लगता कि आप किस प्रकार का "क्रॉस प्लेटफॉर्म" समाधान चाहते हैं ... विभिन्न प्लेटफॉर्म और विभिन्न हार्डवेयर विभिन्न फ़ॉन्ट संकल्पों और फ़ॉन्ट प्रतिपादन एल्गोरिदम का उपयोग करते हैं। मुझे शायद ही लगता है कि आप उन सभी के लिए निरंतर उत्तर प्राप्त कर सकते हैं। –

+1

कृपया छवियों को अपडेट करें यदि आप कर सकते हैं, क्योंकि वे अभी चले गए हैं। – Nae

उत्तर

19

आपके पास दो समस्याएं हैं। उन्हें एक एक समय

1 में से निपटने करते हैं: एक ही फॉन्ट के साथ एक ही मंच पर अजगर 2.5 और 2.6 के बीच का अंतर

अजगर के इन दोनों संस्करणों टी के विभिन्न संस्करणों का उपयोग करें। मेरे मैक बॉक्स पर, 2.5 टीके संस्करण 8.4.1 9 और 2.6 का उपयोग 8.5.7 का उपयोग करता है। टीके के संस्करण 8.5.2 में टीके की फ़ॉन्ट मापन सुविधाओं में कुछ बदलाव थे। यह मानते हुए कि परिवर्तन में सुधार हुए थे, मुझे लगता है कि यह मानना ​​सुरक्षित है कि पाइथन 2.6 से प्राप्त होने वाली संख्या 2.5 से अधिक सटीक हैं।

2: मैक पर पायथन 2.6 और पीसी पर 2.6 के बीच का अंतर।

जाहिर है, आपके द्वारा शामिल स्क्रीनशॉट से, पीसी एक बड़ा फ़ॉन्ट का उपयोग कर रहा है और इस प्रकार आपको माप के लिए बड़ी संख्या मिलती है। सवाल यह है, क्यों? आप अंक में फ़ॉन्ट आकार (एक इंच का 1/72) निर्दिष्ट कर रहे हैं। फ़ॉन्ट को प्रस्तुत करने के लिए (या कोई प्रतिपादन प्रणाली) के क्रम में, यह जानना आवश्यक है कि वास्तविक प्रदर्शन पर एक इंच में कितने पिक्सल हैं। यह अलग-अलग प्रणालियों पर अलग-अलग होगा, और इसकी गणना करने के लिए टी को हमेशा अंतर्निहित ओएस द्वारा सटीक संख्या नहीं दी जाती है।

ऐतिहासिक रूप से, ऐप्पल और माइक्रोसॉफ्ट ने वास्तविक प्रदर्शन के बावजूद 72ppi और 96ppi पर मानकीकृत किया है, इसलिए संख्याएं हमेशा अलग होने जा रही हैं। मैक और विंडोज़ पिक्सल घनत्व की गणना करने के अंतरों के बारे में अधिक जानकारी के लिए विकिपीडिया पर Dots Per Inch आलेख देखें।

आप पॉइंट्स के बजाय पिक्सेल में फ़ॉन्ट निर्दिष्ट करके इसे हल करने का प्रयास कर सकते हैं।आप फ़ॉन्ट आकार के लिए नकारात्मक संख्याओं का उपयोग कर ऐसा कर सकते हैं।

अंत में, एक चीज जो आप अपने छोटे उदाहरण कोड में जोड़ सकते हैं, font.actual() कमांड के परिणाम को प्रिंट करना है - आप अपने विंडोज़ और मैक बक्से के बीच कुछ अलग देख सकते हैं, जो वहां मतभेदों को समझाएगा। यह आपको बताता है कि किस फ़ॉन्ट का उपयोग टीके द्वारा किया जा रहा है।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद! आपने मुझे दो समस्याओं को समझ लिया और ठीक किया। पहला पायथन 2.6 के मेरे संस्करण से आया: अर्थात्, 2.6.1, जो वास्तव में फ़ॉन्ट से संबंधित एक रिग्रेशन बग का सामना करता है मीट्रिक: पायथन 2.6.5 को अपडेट करना आसान समाधान था। दूसरी समस्या तब भी गायब हो गई जब मैंने फोंट के आकार को निर्दिष्ट करने के लिए नकारात्मक संख्याओं का उपयोग किया। यह हो उद्धारकर्ता को वास्तव में http://www.tcl.tk/man/tcl8.4/TkCmd/tk.htm पर अन्य दस्तावेज में समझाया गया था, जिसे मैं नहीं जानता था। अब सभी चट्टानें और मैं बहुत आभारी हूं! – Aristide

+0

@Aristide: यदि मेरा उत्तर या कोई अन्य उत्तर आपकी मदद करता है, तो कृपया उत्तर को 'स्वीकृत' के रूप में चिह्नित करने पर विचार करें - यह प्रश्न-प्रश्नकर्ता के रूप में आपके कर्तव्य का हिस्सा है। –

+0

आपके उत्तर ने मेरी मदद की। मैंने इसे पहले से ही उपयोगी के रूप में चिह्नित किया है, लेकिन मेरे बाकी कर्तव्यों के लिए, सिस्टम कहता रहता है: "आप इस जवाब को स्वीकार कर सकते हैं और 10 घंटे में अपना बक्षीस दे सकते हैं"। मुझे लगता है कि 24h की न्यूनतम देरी है। कृपया आश्वस्त रहें कि मैं खुशी से कल फिर से प्रयास करूंगा! – Aristide

5

आपने कुछ भी गलत नहीं किया है: फ़ॉन्ट्स का आकार प्लेटफ़ॉर्म से प्लेटफ़ॉर्म तक भिन्न होता है।

मुझे यकीन नहीं है कि पायथन संस्करण क्यों मायने रखता है, लेकिन मतभेद केवल एक पिक्सेल हैं, इसलिए यह एक ही फ़ॉन्ट के अलग-अलग गोल या अलग प्रतिपादन हो सकता है।

+2

पायथन संस्करण मायने रखता है क्योंकि टीके संस्करण मायने रखता है - टीके 8.4.x और 8.5.x के बीच फ़ॉन्ट मापन बदल गया है (पायथन 2.5 और 2.6 द्वारा उपयोग किए जाने वाले संस्करण, क्रमशः) –

6

उम्र के लिए खोज करने के बाद मुझे अंततः किसी भी फ़ॉन्ट और आकार में कुछ पाठ की चौड़ाई प्राप्त करने का एक तरीका मिला!

from tkinter import * 

Window = Tk() 
Window.geometry("500x500+80+80") 

frame = Frame(Window) # this will hold the label 
frame.pack(side = "top") 

# CALCULATE: 
measure = Label(frame, font = ("Purisa", 10), text = "The width of this in pixels is.....", bg = "yellow") 
measure.grid(row = 0, column = 0) # put the label in 
measure.update_idletasks() # this is VERY important, it makes python calculate the width 
width = measure.winfo_width() # get the width 

# PROOF IT WORKS: 
canvas = Canvas(frame, width = 400, height = 200, bg = "light green") 
canvas.grid(row = 1, column = 0, columnspan = 100) # collumnspan is 100 so that the line lines up with the text 
line = canvas.create_line(0, 10, width, 10, width = 4) # make a line the same length as the text 
canvas.create_text(10, 20, font = ("Purisa", 10), text = "... "+str(width)+" Pixels", anchor = "nw") 

मैं जो लाइन बनाता हूं वह सबूत है कि यह किसी भी फ़ॉन्ट के लिए काम करता है।

मैंने इसे विभिन्न फ़ॉन्ट्स और आकारों के लिए परीक्षण किया है, जहां तक ​​मुझे पता है कि यह काम करता है। This is a picture of the output

+0

यह उन सभी उपयोगकर्ताओं को रोक देगा जो WWWWWWWWWWW टाइप करने के लिए मजेदार लगता है, इसलिए यह स्क्रीन पर फिट नहीं है !!!!!!!!!!! –

संबंधित मुद्दे