Python Tkinter Place按钮位于框架左侧
如何将下面代码中的退出按钮放置在框架的最右侧? 我尝试了以下几种方法: 帕德克斯 及 自我包装(side=“top”,anchor=“e”) 但在试了15次之后,两个按钮都很接近。也许任何人的帮助都会很感激。我需要一个按钮在最右边,另一个在最左边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
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你说得完全正确-我发现栅格几何管理器在这些情况下更容易使用,但可能只有我一个人。