在TkInter中创建计算器,文本框挤压按钮
我正在尝试用tkinter创建一个网格格式的计算器,但文本框把按钮挤开了。
我还是Python的新手,现在遇到麻烦了。
这是我写的代码的一部分:
from Tkinter import*
#function for about menu
def about():
win2=Tk()
win2.wm_title("About")
l=Label(win2,text=" CAL-C ver 1.0 \n Developer. \n Mohd Sanad",padx=5,pady=40)
l.pack()
win=Tk()#creating window
win.wm_title("CAL-C")#changing window title
#Initiliazing about menu button
menubar=Menu(win)
menubar.add_command(label="About",command=about)
win.config(menu=menubar)
v=StringVar()
e=Entry(win,textvariable=v)
e.grid(row=0,column=0,columnspan=3,sticky=W+E)
b1=Button(win,text="1")
b2=Button(win,text="2")
b3=Button(win,text="3")
b4=Button(win,text="4")
b5=Button(win,text="5")
b6=Button(win,text="6")
b7=Button(win,text="7")
b8=Button(win,text="8")
b9=Button(win,text="9")
b1.grid(row=1,column=0)
b2.grid(row=1,column=1)
b3.grid(row=1,column=2)
b4.grid(row=2,column=0)
b5.grid(row=2,column=1)
b6.grid(row=2,column=2)
b7.grid(row=3,column=0)
b8.grid(row=3,column=1)
b9.grid(row=3,column=2)
1 个回答
1
下面的教程很好地介绍了如何在TkInter中使用不同的布局管理器,还有一个关于如何创建计算器的例子。
http://zetcode.com/gui/tkinter/layout/
补充说明:
我觉得文本框会把按钮挤开的原因是,输入框和前三个按钮放在同一行,但没有为文本框指定列。这可能导致输入框默认放在第0列,从而把按钮挤走了。
你可以试着把输入框放在自己的一行,并使用columnspan让它跨越多个列,同时加上sticky=W+E让它在列中扩展,像这样:
v=StringVar()
e=Entry(win,textvariable=v)
# the columnspan make the entry widget strech over more columns
e.grid(row=0, column=0, columnspan=4, sticky=W+E)
b1.grid(row=1,column=0, sticky=W+E)
b2.grid(row=1,column=1, sticky=W+E)
b3.grid(row=1,column=2, sticky=W+E)
b4.grid(row=2,column=0, sticky=W+E)
b5.grid(row=2,column=1, sticky=W+E)
b6.grid(row=2,column=2, sticky=W+E)
b7.grid(row=3,column=0, sticky=W+E)
b8.grid(row=3,column=1, sticky=W+E)
b9.grid(row=3,column=2, sticky=W+E)
这里有一个在我电脑上正确显示的例子:
from Tkinter import Tk, W, E
from ttk import Frame, Button, Label, Style
from ttk import Entry
class Example(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.initUI()
def initUI(self):
e=Entry(self)
b1 = Button(self, text="1")
b2 = Button(self, text="2")
b3 = Button(self, text="3")
b4 = Button(self, text="4")
b5 = Button(self, text="5")
b6 = Button(self, text="6")
b7 = Button(self, text="7")
b8 = Button(self, text="8")
b9 = Button(self, text="9")
e.grid(row=0, column=0, columnspan=4, sticky=W+E)
b1.grid(row=1,column=0)
b2.grid(row=1,column=1)
b3.grid(row=1,column=2)
b4.grid(row=2,column=0)
b5.grid(row=2,column=1)
b6.grid(row=2,column=2)
b7.grid(row=3,column=0)
b8.grid(row=3,column=1)
b9.grid(row=3,column=2)
self.pack()
def main():
root = Tk()
app = Example(root)
root.mainloop()
if __name__ == '__main__':
main()