Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinter按钮未对齐_Python_User Interface_Tkinter - Fatal编程技术网

Python tkinter按钮未对齐

Python tkinter按钮未对齐,python,user-interface,tkinter,Python,User Interface,Tkinter,我目前正在尝试根据线框创建窗口。然而,在使用网格时,我的按钮之间有一个奇怪的空间,尽管在单元格中有适当的行分布。我很好奇,这是怎么回事?如何正确对齐这些按钮 线框: 实际产量: 注意“清除”和“计算”按钮之间的空间 以下是我的按钮代码: clearButton = Button(window, text="Clear", width = 10) clearButton.grid(row = 3, column = 3) computeButton = Button(window, text="C

我目前正在尝试根据线框创建窗口。然而,在使用网格时,我的按钮之间有一个奇怪的空间,尽管在单元格中有适当的行分布。我很好奇,这是怎么回事?如何正确对齐这些按钮

线框:

实际产量: 注意“清除”和“计算”按钮之间的空间

以下是我的按钮代码:

clearButton = Button(window, text="Clear", width = 10)
clearButton.grid(row = 3, column = 3)
computeButton = Button(window, text="Compute", width=10)
computeButton.grid(row = 4, column = 3)
exitButton = Button(window, text="Exit", width = 10)
exitButton.grid(row = 5, column = 3)
以下是整个窗口的代码:

import tkinter
from tkinter import *

window = tkinter.Tk()

window.geometry('600x400')

yearLabel = Label(window, text="Year")
yearLabel.grid(row=0, column=0)

amountLabel = Label(window, text="Amount")
amountLabel.grid(row=1, column=0)

rateLabel = Label(window, text="Rate")
rateLabel.grid(row=2, column=0)

monthlyPaymentLabel = Label(window, text="Monthly Payment")
monthlyPaymentLabel.grid(row = 0, column = 3)

totalInterestLabel = Label(window, text="Total Interest Paid")
totalInterestLabel.grid(row = 1, column = 3)




yearText = StringVar()
yt = Entry(window, textvariable=yearText)
yt.grid(row=0, column=1)

amountText = StringVar()
at = Entry(window, textvariable=yearText)
at.grid(row=1, column=1)

rateText = StringVar()
rt = Entry(window, textvariable=rateText)
rt.grid(row=2, column=1)




box = Listbox(window, height = 10, width = 50)
box.grid(row = 3, column = 0, columnspan=3)

scroll = Scrollbar(window)

scroll.grid(row=2, column=2, rowspan = 6)

box.configure(yscrollcommand = scroll.set)
scroll.configure(command = box.yview)


clearButton = Button(window, text="Clear", width = 10)
clearButton.grid(row = 3, column = 3)
computeButton = Button(window, text="Compute", width=10)
computeButton.grid(row = 4, column = 3)
exitButton = Button(window, text="Exit", width = 10)
exitButton.grid(row = 5, column = 3)

window.mainloop()

我建议将主框架划分为多个框架。 如果gui小部件变得更复杂,那么做propper几何体将是一件痛苦的事情

我将主框架分为两部分:顶部和底部,因此您不需要处理columnspan和rowspan,这对于复杂的gui来说很困难

我添加了pady和padx作为小部件之间的间隙,您可以根据需要更改它的大小

import tkinter
from tkinter import *

window = tkinter.Tk()
window.geometry('600x400')

top_frame = Frame(window)
top_frame.grid(row=0, column=0, sticky=W)

yearLabel = Label(top_frame, text="Year")
yearLabel.grid(row=0, column=0, padx=30)

amountLabel = Label(top_frame, text="Amount")
amountLabel.grid(row=1, column=0)

rateLabel = Label(top_frame, text="Rate")
rateLabel.grid(row=2, column=0)

yearText = StringVar()
yt = Entry(top_frame, textvariable=yearText)
yt.grid(row=0, column=1, padx=30)

amountText = StringVar()
at = Entry(top_frame, textvariable=yearText)
at.grid(row=1, column=1)

rateText = StringVar()
rt = Entry(top_frame, textvariable=rateText)
rt.grid(row=2, column=1)

monthlyPaymentLabel = Label(top_frame, text="Monthly Payment")
monthlyPaymentLabel.grid(row = 0, column = 3, padx=30)

totalInterestLabel = Label(top_frame, text="Total Interest Paid")
totalInterestLabel.grid(row = 1, column = 3)


bottom_frame = Frame(window)
bottom_frame.grid(row=1, column=0 )

box = Listbox(bottom_frame, height = 10, width = 80)
box.grid(row=0, column=0)

scroll = Scrollbar(bottom_frame)

scroll.grid(row=0, column=1)

box.configure(yscrollcommand = scroll.set)
scroll.configure(command = box.yview)

b_right_frame = Frame(bottom_frame)
b_right_frame.grid(row=0, column=2, sticky=N)

clearButton = Button(b_right_frame, text="Compute", width = 10)
clearButton.grid(row = 0, column = 2, sticky=N)
computeButton = Button(b_right_frame, text="Clear", width=10)
computeButton.grid(row = 1, column = 2, sticky=N, pady=10)
exitButton = Button(b_right_frame, text="Exit", width = 10)
exitButton.grid(row = 2, column = 2, sticky=N)

window.mainloop()

您可以将
行span=3
添加到
列表框
。因此,
列表框
所用的时间与三个按钮(计算、清除、退出)所用的时间相同。

完整代码:

import tkinter
from tkinter import *

window = tkinter.Tk()
window.geometry('600x400')

yearLabel = Label(window, text="Year")
yearLabel.grid(row=0, column=0)

amountLabel = Label(window, text="Amount")
amountLabel.grid(row=1, column=0)

rateLabel = Label(window, text="Rate")
rateLabel.grid(row=2, column=0)

monthlyPaymentLabel = Label(window, text="Monthly Payment")
monthlyPaymentLabel.grid(row=0, column=3)

totalInterestLabel = Label(window, text="Total Interest Paid")
totalInterestLabel.grid(row=1, column=3)

yearText = StringVar()
yt = Entry(window, textvariable=yearText)
yt.grid(row=0, column=1)

amountText = StringVar()
at = Entry(window, textvariable=yearText)
at.grid(row=1, column=1)

rateText = StringVar()
rt = Entry(window, textvariable=rateText)
rt.grid(row=2, column=1)

box = Listbox(window, height=10, width=50)
box.grid(row=3, column=0, rowspan=3, columnspan=3)

scroll = Scrollbar(window)
scroll.grid(row=2, column=2, rowspan=6)

box.configure(yscrollcommand=scroll.set)
scroll.configure(command=box.yview)


clearButton = Button(window, text="Clear", width=10)
clearButton.grid(row=3, column=3)

computeButton = Button(window, text="Compute", width=10)
computeButton.grid(row=4, column=3)

exitButton = Button(window, text="Exit", width=10)
exitButton.grid(row=5, column=3)

window.mainloop()
但是,如果要使按钮更靠近,并且
列表框
比按钮占用更多空间,则添加
行span=12

在oo解决方案下面

请注意,列表框插入到与其他框分开的框架中

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox

class App(tk.Frame):

    def __init__(self,):

        super().__init__()

        self.master.title("Hello World")

        self.year = tk.IntVar()
        self.amount = tk.DoubleVar()
        self.rate = tk.DoubleVar()
        self.interest = tk.DoubleVar()
        self.payment = tk.DoubleVar()

        self.init_ui()

    def init_ui(self):

        w = tk.Frame()

        r =0
        ttk.Label(w, text="Year:").grid(row=r, sticky=tk.W)
        ttk.Entry(w,width=8, textvariable=self.year).grid(row=r, column=1, padx=5, pady=5,sticky=tk.W)

        r =1
        ttk.Label(w, text="Amount:").grid(row=r, sticky=tk.W)
        ttk.Entry(w,width=8, textvariable=self.amount).grid(row=r, column=1, padx=5, pady=5,sticky=tk.W)

        r =2
        ttk.Label(w, text="Rate:").grid(row=r, sticky=tk.W)
        ttk.Entry(w,width=8, textvariable=self.rate).grid(row=r, column=1, padx=5, pady=5,sticky=tk.W)

        r =0
        ttk.Label(w, text="Monthly Payment:").grid(row=r, column=3, sticky=tk.W)
        ttk.Entry(w,width=8, textvariable=self.payment).grid(row=r, column=4, padx=5, pady=5,sticky=tk.W)

        r =1
        ttk.Label(w, text="Total Interest Paid:").grid(row=r, column=3, sticky=tk.W)
        ttk.Entry(w,width=8, textvariable=self.interest).grid(row=r, column=4, padx=5, pady=5,sticky=tk.W)

        c =5
        bts = [('Clear', self.on_clear),
               ('Compute', self.on_compute),
               ('Exit', self.on_exit),]

        for r, btn in enumerate(bts):
            b = ttk.Button(w, text=btn[0], underline=0)
            b.bind("<Button-1>", btn[1])
            b.grid(row=r, column=c, sticky=tk.W+tk.E, padx=5, pady=5)

        w.grid(row=0, column=0, sticky=tk.N+tk.W+tk.S+tk.E)

        w2 = tk.Frame()

        self.get_listbox(w2,0,0,10,45).grid(padx=5, pady=5)

        w2.grid(sticky=tk.W)

    def on_clear(self,evt=None):
        msg = "To assign!"
        messagebox.showwarning(self.master.title(),msg)      

    def on_compute(self,evt=None):
        msg = "To assign!"
        messagebox.showwarning(self.master.title(),msg)      

    def on_exit(self,evt=None):
        self.master.destroy()

    def get_listbox(self, container, row, col, height=None, width=None):

        sb = tk.Scrollbar(container,orient=tk.VERTICAL)

        w = tk.Listbox(container,
                    relief=tk.GROOVE,
                    selectmode=tk.BROWSE,
                    height=height,
                    width=width,
                    background = 'white',
                    font='TkFixedFont',
                    yscrollcommand=sb.set,)

        sb.config(command=w.yview)

        sb.grid(column=1, sticky=tk.N+tk.S)
        w.grid(row=row, column=col)

        return w        

if __name__ == '__main__':
    app = App()
    app.mainloop()
将tkinter作为tk导入
从tkinter导入ttk
从tkinter导入消息框
类应用程序(tk.Frame):
定义初始值(self,):
super()。\uuuu init\uuuuu()
self.master.title(“你好,世界”)
self.year=tk.IntVar()
self.amount=tk.DoubleVar()
self.rate=tk.DoubleVar()
self.interest=tk.DoubleVar()
self.payment=tk.DoubleVar()
self.init_ui()
def初始用户界面(自身):
w=tk.Frame()
r=0
ttk.Label(w,text=“Year:”).grid(row=r,sticky=tk.w)
ttk.Entry(w,width=8,textvariable=self.year).grid(row=r,column=1,padx=5,pady=5,sticky=tk.w)
r=1
ttk.Label(w,text=“Amount:”).grid(row=r,sticky=tk.w)
ttk.Entry(w,width=8,textvariable=self.amount).grid(行=r,列=1,padx=5,pady=5,sticky=tk.w)
r=2
ttk.Label(w,text=“Rate:”).grid(row=r,sticky=tk.w)
ttk.Entry(w,width=8,textvariable=self.rate).grid(行=r,列=1,padx=5,pady=5,sticky=tk.w)
r=0
ttk.Label(w,text=“每月付款:”).grid(行=r,列=3,粘性=tk.w)
ttk.Entry(w,width=8,textvariable=self.payment).grid(行=r,列=4,padx=5,pady=5,sticky=tk.w)
r=1
ttk.Label(w,text=“支付的利息总额:”).grid(行=r,列=3,粘性=tk.w)
ttk.Entry(w,width=8,textvariable=self.interest).grid(row=r,column=4,padx=5,pady=5,sticky=tk.w)
c=5
bts=[(“清除”,自开启清除),
('Compute',self.on_Compute),
('Exit',self.on_Exit),]
对于r,枚举中的btn(bts):
b=ttk.按钮(w,text=btn[0],下划线=0)
b、 绑定(“,btn[1])
b、 网格(行=r,列=c,粘性=tk.W+tk.E,padx=5,pady=5)
w、 网格(行=0,列=0,粘性=tk.N+tk.w+tk.S+tk.E)
w2=tk.Frame()
self.get_列表框(w2,0,0,10,45).grid(padx=5,pady=5)
w2.格栅(粘性=tk.W)
def on_清除(自身,evt=无):
msg=“要分配!”
messagebox.showwarning(self.master.title(),msg)
计算时的def(自身,evt=None):
msg=“要分配!”
messagebox.showwarning(self.master.title(),msg)
def on_出口(自身,evt=无):
self.master.destroy()
def get_列表框(自身、容器、行、列、高度=无、宽度=无):
sb=tk.滚动条(容器,方向=tk.垂直)
w=tk.列表框(容器,
卸压=tk.GROOVE,
选择mode=tk.BROWSE,
高度=高度,
宽度=宽度,
背景='白色',
font='TkFixedFont',
yscrollcommand=sb.set,)
sb.config(命令=w.yview)
sb.网格(列=1,粘性=tk.N+tk.S)
w、 网格(行=行,列=列)
返回w
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=app()
app.mainloop()

第二个版本几乎与您的图片相同……我已经移动了按钮

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox

class App(tk.Frame):

    def __init__(self,):

        super().__init__()

        self.master.title("Hello World")
        self.year = tk.IntVar()
        self.amount = tk.DoubleVar()
        self.rate = tk.DoubleVar()
        self.interest = tk.DoubleVar()
        self.payment = tk.DoubleVar()

        self.init_ui()


    def init_ui(self):

        w = tk.Frame()

        r =0
        ttk.Label(w, text="Year:").grid(row=r, sticky=tk.W)
        ttk.Entry(w,width=8, textvariable=self.year).grid(row=r, column=1, padx=5, pady=5,sticky=tk.W)

        r =1
        ttk.Label(w, text="Amount:").grid(row=r, sticky=tk.W)
        ttk.Entry(w,width=8, textvariable=self.amount).grid(row=r, column=1, padx=5, pady=5,sticky=tk.W)

        r =2
        ttk.Label(w, text="Rate:").grid(row=r, sticky=tk.W)
        ttk.Entry(w,width=8, textvariable=self.rate).grid(row=r, column=1, padx=5, pady=5,sticky=tk.W)

        r =0
        ttk.Label(w, text="Monthly Payment:").grid(row=r, column=3, sticky=tk.W)
        ttk.Entry(w,width=8, textvariable=self.payment).grid(row=r, column=4, padx=5, pady=5,sticky=tk.W)

        r =1
        ttk.Label(w, text="Total Interest Paid:").grid(row=r, column=3, sticky=tk.W)
        ttk.Entry(w,width=8, textvariable=self.interest).grid(row=r, column=4, padx=5, pady=5,sticky=tk.W)

        w.grid(row=0, column=0, sticky=tk.N+tk.W+tk.S+tk.E)

        #lisbox
        w2 = tk.Frame()

        self.get_listbox(w2,0,0,10,45).grid(padx=5, pady=5)

        w2.grid(row=3, column=0, sticky=tk.N+tk.W+tk.S+tk.E)

        #buttons
        bts = [('Clear', self.on_clear),
               ('Compute', self.on_compute),
               ('Exit', self.on_exit),]

        w3 = tk.Frame()

        for r, btn in enumerate(bts):
            b = ttk.Button(w3, text=btn[0], underline=0)
            b.bind("<Button-1>", btn[1])
            b.grid(row=r, column=0, sticky=tk.N, padx=5, pady=5)

        w3.grid(row=3,column =4, sticky=tk.N)


    def on_clear(self,evt=None):
        msg = "To assign!"
        messagebox.showwarning(self.master.title(),msg)      

    def on_compute(self,evt=None):
        msg = "To assign!"
        messagebox.showwarning(self.master.title(),msg)      

    def on_exit(self,evt=None):
        self.master.destroy()

    def get_listbox(self, container, row, col, height=None, width=None):

        sb = tk.Scrollbar(container,orient=tk.VERTICAL)

        w = tk.Listbox(container,
                    relief=tk.GROOVE,
                    selectmode=tk.BROWSE,
                    height=height,
                    width=width,
                    background = 'white',
                    font='TkFixedFont',
                    yscrollcommand=sb.set,)

        sb.config(command=w.yview)

        sb.grid(column=1, sticky=tk.N+tk.S)
        w.grid(row=row, column=col)

        return w        

if __name__ == '__main__':
    app = App()
    app.mainloop()
将tkinter作为tk导入
从tkinter导入ttk
从tkinter导入消息框
类应用程序(tk.Frame):
定义初始值(self,):
super()。\uuuu init\uuuuu()
self.master.title(“你好,世界”)
self.year=tk.IntVar()
self.amount=tk.DoubleVar()
self.rate=tk.DoubleVar()
self.interest=tk.DoubleVar()
self.payment=tk.DoubleVar()
self.init_ui()
def初始用户界面(自身):
w=tk.Frame()
r=0
ttk.Label(w,text=“Year:”).grid(row=r,sticky=tk.w)
ttk.Entry(w,width=8,textvariable=self.year).grid(row=r,column=1,padx=5,pady=5,sticky=tk.w)
r=1
ttk.Label(w,text=“Amount:”).grid(row=r,sticky=tk.w)
ttk.Entry(w,width=8,textvariable=self.amount).grid(行=r,列=1,padx=5,pady=5,sticky=tk.w)
r=2
ttk.Label(w,text=“Rate:”).grid(row=r,sticky=tk.w)
ttk.Entry(w,width=8,textvariable=self.rate).grid(行=r,列=1,padx=5,pady=5,sticky=tk.w)
r=0
ttk.Label(w,text=“每月付款:”).grid(行=r,列=3,粘性=tk.w)
ttk.Entry(w,width=8,textvariable=self.payment).grid(行=r,列=4,padx=5,pady=5,sticky=tk.w)
r=1
ttk.Label(w,text=“支付的利息总额:”).grid(行=r,列=3,粘性=tk.w)
ttk.Entry(w,width=8,textvariable=self.interest).grid(row=r,column=4,padx=5,pady=5,sticky=tk.w)
w、 网格(行=0,列=0,粘性=tk.N+tk.w+tk.S+tk.E)
#里斯本
w2=tk.Frame()
self.get_列表框(w2,0,0,10,45).grid(padx=5,pady=5)
网格(行=3,列=0,粘性=tk.N+tk.W+tk.S+tk.E)
#钮扣
bts=[(“清除”,自开启清除),
(‘计算’,