【问题标题】:Gaps In Grid Spaces - TKInter网格空间中的间隙 - TKInter
【发布时间】:2018-07-28 01:00:52
【问题描述】:

Python 3

我正在使用 Tkinter 并且得到了意想不到的结果。我想做的是拥有 不同的标签、按钮和输入框,以更好地练习我鲜为人知的 Tkinter 技能。

这是我的代码:

from tkinter import *

def display_music(event):
    music = favoriteMusician.get()

    outputEntry.delete(0, 'end')

    outputEntry.insert(0, 'Your favorite musician is %s' % music)

def divide(event):
    answer = str(int(num1Entry.get())/int(num2Entry.get()))
    divideEntry.delete(0, 'end')
    divideEntry.insert(0, answer)


root = Tk()

Label(root, text='Who is your favorite musician?').grid(row=0, column=0, sticky=W)

favoriteMusician = Entry(root)
favoriteMusician.grid(row=0, column=2, sticky=W)

b1 = Button(root, text='Output:')
b1.bind('<Button-1>', display_music)
b1.grid(row=1, column=0, sticky=W)

outputEntry = Entry(root)
outputEntry.grid(row=1, column=1, columnspan=2, sticky=W)

num1Entry = Entry(root)
num1Entry.grid(row=2, column=0, sticky=W)

Label(root, text='/').grid(row=2, column=1, sticky=W)

num2Entry = Entry(root)
num2Entry.grid(row=2, column=2, sticky=W)

b2 = Button(root, text='=')
b2.bind('<Button-1>', divide)
b2.grid(row=2, column=3, sticky=W)


divideEntry = Entry(root)
divideEntry.grid(row=2, column=4, sticky=W)


root.mainloop()

但是当我运行代码时。存在布局问题,我希望一切都对齐,但并非一切都对齐,而且我不知道如何摆脱大空间。以下是它目前的样子:

我知道这与 Tkinter 根据现有单元格的大小决定单元格大小(对于grid())有关。我做了研究,但找不到答案。

除了答案之外,我很乐意提供有关如何编写更好代码的反馈,以及一些免费学习 python 的资源。

【问题讨论】:

    标签: python python-3.x tkinter


    【解决方案1】:

    使用grid() layout-manager 时,有多种方法可以让小部件在 Tkinter 中对齐。对于同一行上的两个小部件,可以给第一个小部件sticky=E 选项,然后给下面一个sticky=W。这会将两者推到一起。我已经为前两行中的小部件这样做了。

    另一种方法是将整行设为嵌套的Frame,其中包含所有小部件。嵌套框架内的布局与包含 Frame 的位置无关。我为你最后拥有的四个小部件组做了这个。

    虽然它与对齐或布局无关,但我还将display_music()divide() 函数更改为Button 回调(使用它们接受的command=xxx 参数),而不是将它们附加到通过bind()ing 将事件发送到特定的小部件(这意味着它们将不再收到 event 参数——无论如何你都没有使用)。

    from tkinter import *
    
    # Button callbacks (which are NOT event handlers)
    def display_music():
        music = favoriteMusician.get()
        outputEntry.delete(0, 'end')
        outputEntry.insert(0, 'Your favorite musician is %s' % music)
    
    def divide():
        answer = str(int(num1Entry.get())/int(num2Entry.get()))
        divideEntry.delete(0, 'end')
        divideEntry.insert(0, answer)
    
    
    root = Tk()
    
    # Row 0
    label1 = Label(root, text='Who is your favorite musician?')
    label1.grid(row=0, column=0, sticky=E)
    
    favoriteMusician = Entry(root)
    favoriteMusician.grid(row=0, column=1, sticky=W)
    
    # Row 1
    b1 = Button(root, text='Output:', command=display_music)
    b1.grid(row=1, column=0, sticky=E)
    #b1.bind('<Button-1>', display_music)
    
    outputEntry = Entry(root, width=30)
    #outputEntry.grid(row=1, column=1, columnspan=2, sticky=W)
    outputEntry.grid(row=1, column=1, sticky=W)
    
    # Row 2
    mathFrame = Frame(root)
    mathFrame.grid(row=2, column=0, columnspan=4)
    
    num1Entry = Entry(mathFrame)
    num1Entry.grid(row=2, column=0, sticky=W)
    
    label2 = Label(mathFrame, text='/')
    label2.grid(row=2, column=1, sticky=W)
    
    num2Entry = Entry(mathFrame)
    num2Entry.grid(row=2, column=2, sticky=W)
    
    b2 = Button(mathFrame, text='=', command=divide)
    b2.grid(row=2, column=3, sticky=W)
    #b2.bind('<Button-1>', divide)
    
    divideEntry = Entry(mathFrame)
    divideEntry.grid(row=2, column=4, sticky=W)
    
    
    root.mainloop()
    

    这是运行的样子:

    这里有几个相关 Tkinter 文章的链接:

    The Tkinter Grid Geometry Manager,Fredrik Lundh(Tkinter 的作者)
    Tkinter 8.5 reference: a GUI for Python,John Shipman(新墨西哥技术计算机中心)

    【讨论】:

      【解决方案2】:

      您只需确保columnspan 在网格的不同单元格中匹配。此代码应产生所需的输出: 从 tkinter 导入 *

      def display_music(event):
          music = favoriteMusician.get()
          outputEntry.delete(0, 'end')
          outputEntry.insert(0, 'Your favorite musician is %s' % music)
      
      def divide(event):
          answer = str(int(num1Entry.get())/int(num2Entry.get()))
          divideEntry.delete(0, 'end')
          divideEntry.insert(0, answer)
      
      
      root = Tk()
      Label(root, text='Who is your favorite musician?').grid(row=0, column=0, columnspan=2, sticky=W)
      
      favoriteMusician = Entry(root, width=30)
      favoriteMusician.grid(row=0, column=2, columnspan=5, sticky=W)
      
      b1 = Button(root, text='Output:')
      b1.bind('<Button-1>', display_music)
      b1.grid(row=1, column=0, columnspan=2, sticky=W)
      
      outputEntry = Entry(root, width=30)
      outputEntry.grid(row=1, column=2, columnspan=2, sticky=W)
      
      
      
      
      num1Entry = Entry(root)
      num1Entry.grid(row=2, column=0, columnspan=1, sticky=W)
      
      Label(root, text='/').grid(row=2, column=1, columnspan=1, sticky=W)
      
      num2Entry = Entry(root)
      num2Entry.grid(row=2, column=2,columnspan=1, sticky=W)
      
      b2 = Button(root, text='=')
      b2.bind('<Button-1>', divide)
      b2.grid(row=2, column=3, columnspan=1, sticky=W)
      
      
      divideEntry = Entry(root)
      divideEntry.grid(row=2, column=4, columnspan=1, sticky=W)
      
      
      root.mainloop()
      

      【讨论】:

        猜你喜欢
        • 2011-08-16
        • 2018-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-01
        • 2015-08-05
        • 1970-01-01
        相关资源
        最近更新 更多