指定Tkinter文本框的像素尺寸

36

我该如何使用像素指定Tkinter文本框的尺寸?我不是想改变字体大小,而是希望通过这种方式帮助我将其缩放到窗口的大小。


1
很少有这样的情况需要这样做。你是否有某种独特的限制条件,或者你只是不理解如何创建良好的布局? - Bryan Oakley
72
也许他只是想要问题得到答案。 - rhody
2
Rhody,你让我开心极了!ROFL - User1493
@BryanOakley非常有用的问题,例如,如果您需要一个小部件来显示图像,但在创建GUI时还没有图像,但知道要显示图像的大小。 - Roland
@Roland:是的,大家都提出了很好的观点。我之所以问这个问题是因为答案可能取决于原帖作者想要实现的具体目标。答案可能是使用place,或者将文本小部件放在一个可以用像素定义的框架中,或者可能包括创建绑定,以便在渲染后可以了解根窗口的大小等等。 - Bryan Oakley
10个回答

16
你可以将它放在一个框架中,通过停用大小传播并配置条目粘贴到框架边框来强制框架的固定大小。使用pack应该也能以类似的方式工作。
import Tkinter  # tkinter with small t for python 3
#import ttk  # nicer widgets

root = Tkinter.Tk()

mainFrame = Tkinter.Frame(root)
mainFrame.grid()
button = Tkinter.Button(mainFrame, text="dummy")
button.grid()


entryFrame = Tkinter.Frame(mainFrame, width=454, height=20)
entryFrame.grid(row=0, column=1)

# allow the column inside the entryFrame to grow    
entryFrame.columnconfigure(0, weight=10)  

# By default the frame will shrink to whatever is inside of it and 
# ignore width & height. We change that:
entryFrame.grid_propagate(False)
# as far as I know you can not set this for x / y separately so you
# have to choose a proper height for the frame or do something more sophisticated

# input entry
inValue = Tkinter.StringVar()
inValueEntry = Tkinter.Entry(entryFrame, textvariable=inValue)
inValueEntry.grid(sticky="we")


root.mainloop()

3
很难看出这个答案中哪一部分是关键的。 - Denis G. Labrecque

11

我也曾经有同样的问题,似乎最简单的答案是实例化一个指定大小的Frame对象,对其进行打包,然后使用place方法在其中放置和调整小部件的大小。 我发现,在Frame对象上调用pack_propagate(0)方法是不必要的。

这里有一小段代码,用几个小部件说明了这种方法。

在此脚本中实例化的最后一个小部件是一个文本框小部件,其大小按像素指定,正如您的问题所述。

from Tkinter import * #For python 3 use: from Tkinter import *

root = Tk()
root.title("Fee Fie Foe Fum")
frame=Frame(root, width=300, height=160)
frame.pack()
button1 = Button(frame, text="Mercy!")
button1.place(x=10, y=10, height=30, width=100)
button2 = Button(frame, text="Justice!")
button2.place(x=10, y=50, height=30, width=100)
text1 = Label(text="Verdict:")
text1.place(x=10, y=90)
tbox1 = Text(frame)
tbox1.place(x=10, y=115, height=30, width=200)

root.mainloop()

当然,这将限制您在设计Tkinter用户界面时的排版方式,但它允许您以像素为单位指定许多小部件的尺寸。在子小部件上随后使用pack方法将覆盖您的位置和大小设置。

如果您以面向对象的方式表达代码,则代码可能会更有组织性,但此示例仅显示实现以像素而不是其他单位调整小部件大小所需的操作顺序。


正是我想要的。我正在画布上使用“place”。 - jimscafe
嗯...很棒,它帮助了我很多! - Rishi Ratan Pandey

3

就这样做:

from tkinter import *
root = Tk()
t = Text(root)
t.pack(fill=BOTH, expand=1)
root.mainloop()
fill=BOTHexpand=1是最重要的部分。它们使得窗口随着窗口大小而扩展,如果没有其中之一,窗口将无法朝某个方向扩展。

这个怎么指定尺寸?(虽然我不喜欢这样做,但这个回答应该被踩) - Apostolos
他们改变了问题。 - birdwhocancode
啊,那是一个非常糟糕的习惯和政策! - Apostolos

2
这是我的做法。我将文本对象的尺寸放在place标签中。
    firstname = Text()
    firstname.place(x = 170, y = 20, height = 25, width = 200)

非常重要的是要理解,当您创建文本小部件时,任何指定的值都是相对于一个字符的。因此,高度为1表示高度为1个字符。 由于这个原因,许多人可能会发现使用place来指定宽度,并在创建部分中指定高度很有用,以防止出现半个文本框在下一行的情况。 - user14803978

1
您无法将Text的width选项设置为除表示字符数的整数以外的任何内容。但是,当您知道字体时,可以计算该字体中字符串的宽度。反之,如果您知道要求Text的宽度为多少像素,可以计算出可容纳该像素长度的字符数,并将Text宽度设置为该字符数(大致上)。对于等宽字体来说很简单,但对于变宽字体来说就会更加棘手。
Text小部件的默认字体为'TkFixedFont'。
import tkinter as tk
tk.font.Font(font='TkFixedFont').actual()

给出:

{'family': 'Courier New', 'size': 10, 'weight': 'normal', 'slant': 'roman', 'underline': 0, 'overstrike': 0}

这可能不是完美的答案,但它允许您获得接近的结果,而无需引入其他小部件。如果您想要更精确的东西,可以使用框架包装器。


0

这对我很有帮助:

您还可以使用高度和宽度选项来显式设置大小。如果在按钮中显示文本,则这些选项定义按钮的文本单位大小。如果您显示位图或图像,则它们以像素(或其他屏幕单位)定义大小。即使对于文本按钮,您也可以指定像素大小,但需要一些技巧。以下是一种方法(还有其他方法):

f = Frame(master, height=32, width=32) f.pack_propagate(0) # 不要缩小 f.pack()

b = Button(f, text="确定!") b.pack(fill=BOTH, expand=1)

来源:http://effbot.org/tkinterbook/button.htm


我不明白这里的解决方案是什么。这个问题是关于文本框的吗? - Denis G. Labrecque
这个问题是关于文本的。这个答案是关于按钮的。 - LudvigH

0
我宁愿根据我使用的字体来使用内部分割。
text_width = 300
text_height = 200

text_widget = tk.Text(root, width=text_width // 6, height=text_height // 14)
text_widget.pack()

6和14是大约值,需要根据我们使用的字体进行调整。

-3

这是我经常这样做的方式:

from tkinter import *

class App:
    def __init__(self):
        self.tk = Tk()
        self.canvas = Canvas(self.tk, width = 500, height = 500)
        self.canvas.pack()

这将在每个方向上设置尺寸为500像素。当您创建此类的实例时,它会显示此大小的窗口。 希望这可以帮到您!


9
这是一个“画布”——“文本框部件”以字符为单位接受大小,如果想要像素大小就不那么容易了。 - mgilson
1
请查看tcl Tk(8.6版本)本身的参考网站此处。它说,“width”是每行字符数,“height”是行数(简单来说)。还请参考mgilson的评论。 - PiMathCLanguage

-3

可以使用configure设置高度

var = tk.Text(self)
var.configure(height=1)

1
高度是行号而不是像素。 - ViktorMS

-4
entry_2 = Entry(win, justify = 'center')
entry_2.grid(row =2,column = 7,ipadx=10, ipady=10)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接