Python Tkinter Place按钮位于框架左侧

Python Tkinter Place按钮位于框架左侧,python,tkinter,Python,Tkinter,如何将下面代码中的退出按钮放置在框架的最右侧? 我尝试了以下几种方法: 帕德克斯 及 自我包装(side=“top”,anchor=“e”) 但在试了15次之后,两个按钮都很接近。也许任何人的帮助都会很感激。我需要一个按钮在最右边,另一个在最左边 import tkinter as tk from tkinter.ttk import * class Application(tk.Frame): def __init__(self, master=None): tk.F

如何将下面代码中的退出按钮放置在框架的最右侧? 我尝试了以下几种方法:

帕德克斯

自我包装(side=“top”,anchor=“e”)

但在试了15次之后,两个按钮都很接近。也许任何人的帮助都会很感激。我需要一个按钮在最右边,另一个在最左边

import tkinter as tk
from tkinter.ttk import *

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.pack()
        self.createWidgets()
        self.master.title("Log Parser")
    def createWidgets(self):
        self.Run_Main = tk.Button(self)
        self.Run_Main["text"] = "Browse.."
        # self.Run_Main["fg"] = "blue"
        self.Run_Main["command"] = self.Sayhello
        self.Run_Main.pack(side='left')
        self.Label = tk.Label(self)
        self.Label["text"] = 'Processing...'
        self.progressbar = Progressbar(mode="indeterminate", maximum=20)
        self.QUIT = tk.Button(self)
        self.QUIT["text"] = "Quit!"
        self.QUIT["command"] =  self.quit
        self.QUIT.pack(anchor='e')
        self.pack(side="top", anchor="w")

    def Sayhello(self):
       print("Hello")

# scroll text inside application frame
class scrollTxtArea:
    def __init__(self, root):
        frame = tk.Frame(root)
        frame.pack()
        self.textPad(frame)
        return

    def textPad(self, frame):
        # add a frame and put a text area into it
        textPad = tk.Frame(frame)
        self.text = tk.Text(textPad, height=18, width=60)
        self.text.config()
        # add a vertical scroll bar to the text area
        scroll = tk.Scrollbar(textPad)
        self.text.configure(yscrollcommand=scroll.set,background="black", foreground="green")
        # pack everything
        self.text.pack(side=tk.LEFT, pady=2)
        scroll.pack(side=tk.RIGHT, fill=tk.Y)
        textPad.pack(side=tk.TOP)
        return

root = tk.Tk()
root.resizable(width=False, height=False)
root.option_add('*font', ('verdana', 9, 'bold'))
app = Application(master=root)
scrollFrame = scrollTxtArea(root)
app.mainloop()
这些都有帮助。另一个选择是使用tkinter的,它将更直观,让你在未来更有条理

import tkinter as tk
from tkinter.ttk import *

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.pack()
        self.createWidgets()
        self.master.title("Log Parser")
    def createWidgets(self):
        self.Run_Main = tk.Button(self)
        self.Run_Main["text"] = "Browse.."
        # self.Run_Main["fg"] = "blue"
        self.Run_Main["command"] = self.Sayhello
        self.Run_Main.pack(side='left')
        self.Label = tk.Label(self)
        self.Label["text"] = 'Processing...'
        self.Label.pack(side='left')
        self.progressbar = Progressbar(mode="indeterminate", maximum=20)
        self.QUIT = tk.Button(self)
        self.QUIT["text"] = "Quit!"
        self.QUIT["command"] =  self.quit
        self.QUIT.pack(side='right')
        self.pack(side="top", fill=tk.BOTH) # changes here

    def Sayhello(self):
       print("Hello")

# scroll text inside application frame
class scrollTxtArea:
    def __init__(self, root):
        frame = tk.Frame(root)
        frame.pack()
        self.textPad(frame)
        return

    def textPad(self, frame):
        # add a frame and put a text area into it
        textPad = tk.Frame(frame)
        self.text = tk.Text(textPad, height=18, width=60)
        self.text.config()
        # add a vertical scroll bar to the text area
        scroll = tk.Scrollbar(textPad)
        self.text.configure(yscrollcommand=scroll.set,background="black", foreground="green")
        # pack everything
        self.text.pack(side=tk.LEFT, pady=2)
        scroll.pack(side=tk.RIGHT, fill=tk.Y)
        textPad.pack(side=tk.TOP)
        return

root = tk.Tk()
root.resizable(width=False, height=False)
root.option_add('*font', ('verdana', 9, 'bold'))
app = Application(master=root)
scrollFrame = scrollTxtArea(root)
app.mainloop()
这些都有帮助。另一个选择是使用tkinter的,它将更直观,让你在未来更有条理

import tkinter as tk
from tkinter.ttk import *

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.pack()
        self.createWidgets()
        self.master.title("Log Parser")
    def createWidgets(self):
        self.Run_Main = tk.Button(self)
        self.Run_Main["text"] = "Browse.."
        # self.Run_Main["fg"] = "blue"
        self.Run_Main["command"] = self.Sayhello
        self.Run_Main.pack(side='left')
        self.Label = tk.Label(self)
        self.Label["text"] = 'Processing...'
        self.Label.pack(side='left')
        self.progressbar = Progressbar(mode="indeterminate", maximum=20)
        self.QUIT = tk.Button(self)
        self.QUIT["text"] = "Quit!"
        self.QUIT["command"] =  self.quit
        self.QUIT.pack(side='right')
        self.pack(side="top", fill=tk.BOTH) # changes here

    def Sayhello(self):
       print("Hello")

# scroll text inside application frame
class scrollTxtArea:
    def __init__(self, root):
        frame = tk.Frame(root)
        frame.pack()
        self.textPad(frame)
        return

    def textPad(self, frame):
        # add a frame and put a text area into it
        textPad = tk.Frame(frame)
        self.text = tk.Text(textPad, height=18, width=60)
        self.text.config()
        # add a vertical scroll bar to the text area
        scroll = tk.Scrollbar(textPad)
        self.text.configure(yscrollcommand=scroll.set,background="black", foreground="green")
        # pack everything
        self.text.pack(side=tk.LEFT, pady=2)
        scroll.pack(side=tk.RIGHT, fill=tk.Y)
        textPad.pack(side=tk.TOP)
        return

root = tk.Tk()
root.resizable(width=False, height=False)
root.option_add('*font', ('verdana', 9, 'bold'))
app = Application(master=root)
scrollFrame = scrollTxtArea(root)
app.mainloop()

你这里有几个问题

首先,您使用了错误的几何体管理器。顾名思义,packgeometry管理器将小部件尽可能紧密地打包在一起。那不是你想要的。grid geometry manager允许您将小部件放入具有行和列的类似表格的布局中。如果你把浏览按钮放在第一列,退出按钮放在最后一列,你就更接近了

其次,您的
应用程序
窗口包含三个子部件,您只需将其中两个子部件放入几何体管理器中。那会把你搞得一团糟,我都不想去想。所以我把标签放在第1列,退出按钮放在第2列,浏览按钮放在第0列。退出按钮我给了一个“粘滞”值“e”,所以它将被附加到其分配空间的东(右)侧

第三,所有几何体管理器都会尽可能地压缩小部件,除非您明确要求它这样做。我告诉网格管理器展开第2列,以便将额外的空间分配给包含“退出”按钮的单元格

第四,您需要告诉packmanager展开top小部件,使其覆盖整个窗口。该指令是
fill=“x”

第五,在
createWidgets
函数的末尾有一个对packmanager的冗余调用

import tkinter as tk
from tkinter.ttk import *

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.pack(fill="x")
        self.createWidgets()
        self.master.title("Log Parser")
    def createWidgets(self):
        self.Run_Main = tk.Button(self)
        self.Run_Main["text"] = "Browse.."
        # self.Run_Main["fg"] = "blue"
        self.Run_Main["command"] = self.Sayhello
        self.Label = tk.Label(self)
        self.Label["text"] = 'Processing...'
        self.progressbar = Progressbar(mode="indeterminate", maximum=20)
        self.QUIT = tk.Button(self)
        self.QUIT["text"] = "Quit!"
        self.QUIT["command"] =  self.quit
        self.Label.grid(row=0, column=1)
        self.Run_Main.grid(row=0, column=0, sticky="w")
        self.QUIT.grid(row=0, column=2, sticky="e")
        self.columnconfigure(2, weight=1)

    def Sayhello(self):
       print("Hello")

# scroll text inside application frame
class scrollTxtArea:
    def __init__(self, root):
        frame = tk.Frame(root)
        frame.pack()
        self.textPad(frame)
        return

    def textPad(self, frame):
        # add a frame and put a text area into it
        textPad = tk.Frame(frame)
        self.text = tk.Text(textPad, height=18, width=60)
        self.text.config()
        # add a vertical scroll bar to the text area
        scroll = tk.Scrollbar(textPad)
        self.text.configure(yscrollcommand=scroll.set,background="black", foreground="green")
        # pack everything
        self.text.pack(side=tk.LEFT, pady=2)
        scroll.pack(side=tk.RIGHT, fill=tk.Y)
        textPad.pack(side=tk.TOP)
        return

root = tk.Tk()
root.resizable(width=False, height=False)
root.option_add('*font', ('verdana', 9, 'bold'))
app = Application(master=root)
scrollFrame = scrollTxtArea(root)
app.mainloop()

你这里有几个问题

首先,您使用了错误的几何体管理器。顾名思义,packgeometry管理器将小部件尽可能紧密地打包在一起。那不是你想要的。grid geometry manager允许您将小部件放入具有行和列的类似表格的布局中。如果你把浏览按钮放在第一列,退出按钮放在最后一列,你就更接近了

其次,您的
应用程序
窗口包含三个子部件,您只需将其中两个子部件放入几何体管理器中。那会把你搞得一团糟,我都不想去想。所以我把标签放在第1列,退出按钮放在第2列,浏览按钮放在第0列。退出按钮我给了一个“粘滞”值“e”,所以它将被附加到其分配空间的东(右)侧

第三,所有几何体管理器都会尽可能地压缩小部件,除非您明确要求它这样做。我告诉网格管理器展开第2列,以便将额外的空间分配给包含“退出”按钮的单元格

第四,您需要告诉packmanager展开top小部件,使其覆盖整个窗口。该指令是
fill=“x”

第五,在
createWidgets
函数的末尾有一个对packmanager的冗余调用

import tkinter as tk
from tkinter.ttk import *

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.pack(fill="x")
        self.createWidgets()
        self.master.title("Log Parser")
    def createWidgets(self):
        self.Run_Main = tk.Button(self)
        self.Run_Main["text"] = "Browse.."
        # self.Run_Main["fg"] = "blue"
        self.Run_Main["command"] = self.Sayhello
        self.Label = tk.Label(self)
        self.Label["text"] = 'Processing...'
        self.progressbar = Progressbar(mode="indeterminate", maximum=20)
        self.QUIT = tk.Button(self)
        self.QUIT["text"] = "Quit!"
        self.QUIT["command"] =  self.quit
        self.Label.grid(row=0, column=1)
        self.Run_Main.grid(row=0, column=0, sticky="w")
        self.QUIT.grid(row=0, column=2, sticky="e")
        self.columnconfigure(2, weight=1)

    def Sayhello(self):
       print("Hello")

# scroll text inside application frame
class scrollTxtArea:
    def __init__(self, root):
        frame = tk.Frame(root)
        frame.pack()
        self.textPad(frame)
        return

    def textPad(self, frame):
        # add a frame and put a text area into it
        textPad = tk.Frame(frame)
        self.text = tk.Text(textPad, height=18, width=60)
        self.text.config()
        # add a vertical scroll bar to the text area
        scroll = tk.Scrollbar(textPad)
        self.text.configure(yscrollcommand=scroll.set,background="black", foreground="green")
        # pack everything
        self.text.pack(side=tk.LEFT, pady=2)
        scroll.pack(side=tk.RIGHT, fill=tk.Y)
        textPad.pack(side=tk.TOP)
        return

root = tk.Tk()
root.resizable(width=False, height=False)
root.option_add('*font', ('verdana', 9, 'bold'))
app = Application(master=root)
scrollFrame = scrollTxtArea(root)
app.mainloop()

为了获得所需的行为,您可以进行两个简单的修复

首先,您需要打包
应用程序
,以便它填充窗口:

class Application(...):
    def __init__(...):
        ...
        self.pack(fill="x")
self.QUIT.pack(side="right", anchor='e')
接下来,只需将窗口右侧的快速按钮打包:

class Application(...):
    def __init__(...):
        ...
        self.pack(fill="x")
self.QUIT.pack(side="right", anchor='e')

尽管在这个具体的例子中,您只需要做以上的事情,但是您还可以做一些额外的事情,使您的工作更加轻松

我建议专门为按钮创建一个框架。你可以把它放在最上面。然后,将按钮放在这个框架内,并将其包装在左侧或右侧。您将得到相同的结果,但您会发现以后添加其他按钮更容易

我还发现,当您将小部件创建与小部件布局分离时,它使代码更易于阅读、编写、维护和可视化

class Application(...):
    ...
    def createWidgets(self):
        toolbar = tk.Frame(self)
        toolbar.pack(side="top", fill="x")

        self.Run_Main = tk.Button(toolbar)
        self.Label = tk.Label(toolbar)
        self.QUIT = tk.Button(toolbar)
        ...
        self.Run_Main.pack(side="left")
        self.Label.pack(side="left", fill="x")
        self.QUIT.pack(side="right")
        ...

为了获得所需的行为,您可以进行两个简单的修复

首先,您需要打包
应用程序
,以便它填充窗口:

class Application(...):
    def __init__(...):
        ...
        self.pack(fill="x")
self.QUIT.pack(side="right", anchor='e')
接下来,只需将窗口右侧的快速按钮打包:

class Application(...):
    def __init__(...):
        ...
        self.pack(fill="x")
self.QUIT.pack(side="right", anchor='e')

尽管在这个具体的例子中,您只需要做以上的事情,但是您还可以做一些额外的事情,使您的工作更加轻松

我建议专门为按钮创建一个框架。你可以把它放在最上面。然后,将按钮放在这个框架内,并将其包装在左侧或右侧。您将得到相同的结果,但您会发现以后添加其他按钮更容易

我还发现,当您将小部件创建与小部件布局分离时,它使代码更易于阅读、编写、维护和可视化

class Application(...):
    ...
    def createWidgets(self):
        toolbar = tk.Frame(self)
        toolbar.pack(side="top", fill="x")

        self.Run_Main = tk.Button(toolbar)
        self.Label = tk.Label(toolbar)
        self.QUIT = tk.Button(toolbar)
        ...
        self.Run_Main.pack(side="left")
        self.Label.pack(side="left", fill="x")
        self.QUIT.pack(side="right")
        ...

非常详细和有用的答案。感谢“packgeometry管理器,顾名思义,将小部件尽可能紧密地打包在一起。”-这是一个有点误导的说法。你可以使用
pack
,但物品仍然相隔很远。@BryanOakley你完全正确-我发现栅格几何管理器在这些情况下更容易使用,但可能只有我一个人。答案非常详细且有用。感谢“packgeometry管理器,顾名思义,将小部件尽可能紧密地打包在一起。”-这是一个有点误导的说法。你可以使用
pack
,但物品仍然相隔很远。@BryanOakley你说得完全正确-我发现栅格几何管理器在这些情况下更容易使用,但可能只有我一个人。