如何制作tkinter小部件" .place()" python中的方法类似于" .setbounds()" Java中的方法?

时间:2015-06-15 02:00:46

标签: java python tkinter

Python 3.4和Eclipse IDE

我有一个java表单,我正在翻译成python tkinter。我有许多jlabels,jtextfields,jcomboboxes和一个分隔线,需要放在一个相同的python表单上,并与各自的python widget对应。

使用特定定位的java中的示例标签:

    JLabel lblWhichTrip = new JLabel("Which Trip:");
    lblWhichTrip.setHorizontalAlignment(SwingConstants.RIGHT);
    lblWhichTrip.setFont(new Font("Tahoma", Font.PLAIN, 16));
    lblWhichTrip.setBounds(64, 22, 135, 20);
    frmBookCalc.getContentPane().add(lblWhichTrip);

在50个奇怪的浏览器选项卡之后,python等价物应该是:

    self.lblWhichTrip = Label(self, text = "Which Trip:", bg = "white", anchor = "e")
    self.lblWhichTrip.place(x = 64, y = 22, height=135, width=20)

但是小部件根本没有出现,甚至没有出现在错误的地方。

我想使用" .place()" python中的方法与我在java中使用特定定位的原因相同,人们对" .pack()"的精确控制很少。方法

有一个实例,我找到了" .pack()"的一个例子。在" .place()"之前直接调用方法方法,但更多的例子只是" .place()"只用过。

所以这就是问题:

我如何利用" .place()"类似地将python tkinter小部件放在python表单上的方法就像我使用Java表单一样?我知道我很接近但是没有用。

通过更多工作,我发现下面的按钮会在我的表单上放一个按钮,但标签部分是空白的,如上所述。

    languages = ['Python','Perl','C++','Java','Tcl/Tk']
    labels = range(5)
    for i in range(5):
        ct = [random.randrange(256) for x in range(3)]
        brightness = int(round(0.299*ct[0] + 0.587*ct[1] + 0.114*ct[2]))
        ct_hex = "%02x%02x%02x" % tuple(ct)
        bg_colour = '#' + "".join(ct_hex)
        l = Label(self, text=languages[i], fg='White' if brightness < 120 else 'Black', bg=bg_colour)
        l.place(x = 20, y = 30 + i*30, width=120, height=25)

     self.QUIT = Button(self)
     self.QUIT["text"] = "QUIT"
     self.QUIT["fg"]   = "red"
     self.QUIT["command"] =  self.quit
     self.QUIT.pack({"side": "left"})

表格是在一个类结构中制作的,如术语&#34; self&#34;所示。我不知道为什么按钮会在表单上显示,但标签不会。唯一的区别是&#34; .pack()&#34;和&#34; .place()&#34;使用的方法。根据我的研究,它们在功能上是相同的,它们只是以不同的方式进行。

我看了很多眼睛受伤的例子。如果有人能够清除这一点我会永远感激。

参考: Reference for tkinter

更新

&#34; .place()&#34;不喜欢在课堂上或我不知道如何在课堂上实例化它。我通过忽略我想要使用的类结构来实现它。我如何得到&#34; .place()&#34;在班里工作?

更新

import tkinter as tk
import random

root = tk.Tk()

w = 465
h = 590        
x = (root.winfo_screenwidth()/2) - (w/2)
y = (root.winfo_screenheight()/2) - (h/2)
root.minsize(width=w, height=h)
root.maxsize(width=w, height=h)
root.resizable(width=tk.FALSE, height=tk.FALSE)
root.geometry('%dx%d+%d+%d' % (w, h, x, y))
root.configure(background='white')

root.option_add("*font", "Tahoma 12")
root.title("Book Calc")

lblWhichTrip = tk.Label(root, text = "Which Trip:", bg = "white", anchor = "e")
lblWhichTrip.place(x=200, y=30, height=135, width=20)

root.mainloop()

我放弃了py文件和包含所有表单内容的类,其中包含直接代码的单个文件,现在标签再次不可见。上面的代码是我目前的整个程序。我希望我能很快解决这个问题。

更新

高度和宽度需要到位,而不是标签。以上代码已修改。

1 个答案:

答案 0 :(得分:-1)

lblWhichTrip = tk.Label(root, text = "Which Trip:", bg = "white", anchor = "e")
lblWhichTrip.place(x=200, y=30, height=135, width=20)

这在类结构之外工作得非常好,但它似乎不适用于类内部。对于我上面的问题,这是将标签或其他小部件放在python表单上的特定位置的答案的一半。

问题的另一半仍然没有答案,因为这个解决方案在类中不起作用。如果有人能够对此有所了解,那就太棒了。其他人会想要写一个比我现在更强大的程序,所以需要一个比这更好的答案。

谢谢。

更新

root = tk.Tk()
app = Application(root)

以上是您创建课程时的情况。 Root需要直接发送。

def __init__(self, master):
   self.parent = master

指向root的指针需要为持久性设置类var。

lblWhichTrip = tk.Label(root, text = "Which Trip:", bg = "white", anchor = "e")
lblWhichTrip.place(x=85, y=-35, height=135, width=100)

然后你可以在一个类中创建你想要的所有小部件,所有的布局引擎都可以正常工作。 Pack,Place和Grid将完美运行。

尽职尽责地回答。

Refernce: Additional info here