Python Tkinter帧大小定义为父帧大小的一小部分
我试图在Tkinter中构建一个简单的UI,但遇到了一个问题。我在整个应用程序中创建了一个自定义框架对象作为笔记本中的选项卡,自定义框架定义了一个网格,其中左侧包含一组控件,右侧包含另一个笔记本。控制帧正确地设置为父帧宽度的三分之一,但笔记本开始时仅为宽度的一半。如果单击创建更多选项卡并将其添加到笔记本的按钮,笔记本的宽度将扩展,直到控制框无法使用为止。我如何定义东西,使控制帧始终精确地(比如)是父帧宽度的30%,笔记本是宽度的70%,即使父帧调整了大小 Root.pyPython Tkinter帧大小定义为父帧大小的一小部分,python,user-interface,tkinter,Python,User Interface,Tkinter,我试图在Tkinter中构建一个简单的UI,但遇到了一个问题。我在整个应用程序中创建了一个自定义框架对象作为笔记本中的选项卡,自定义框架定义了一个网格,其中左侧包含一组控件,右侧包含另一个笔记本。控制帧正确地设置为父帧宽度的三分之一,但笔记本开始时仅为宽度的一半。如果单击创建更多选项卡并将其添加到笔记本的按钮,笔记本的宽度将扩展,直到控制框无法使用为止。我如何定义东西,使控制帧始终精确地(比如)是父帧宽度的30%,笔记本是宽度的70%,即使父帧调整了大小 Root.py from tki
from tkinter import *
from tkinter.ttk import *
from tkinter import filedialog
import os
from IndexFrame import IndexFrame
root = Tk()
root.option_add('*tearOff', FALSE)
root.title('Test')
width, height = root.winfo_screenwidth(), root.winfo_screenheight()
root.geometry("%dx%d+0+0" % (width, height))
root.grid_propagate(0)
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
menubar = Menu(root)
root['menu'] = menubar
menu_app = Menu(menubar)
menubar.add_cascade(menu=menu_app, label='App')
tabs = Notebook(root)
tabs.grid(row=0, column=0, sticky='nesw')
def openIndex():
dir = filedialog.askdirectory()
tab = IndexFrame(root, dir)
tabs.add(tab, text=os.path.split(dir)[1])
menu_app.add_command(label='Open Index', command=openIndex)
def closeApp():
root.destroy()
menu_app.add_command(label='Close', command=closeApp)
menu_index = Menu(menubar)
menubar.add_cascade(menu=menu_index, label='Index')
def closeIndex():
tabs.forget(tabs.index('current'))
menu_index.add_command(label='Close Index', command=closeIndex)
menu_results = Menu(menubar)
menubar.add_cascade(menu=menu_results, label='Results')
def closeResults():
tabs.nametowidget(tabs.select()).closeResults()
menu_results.add_command(label='Close Results', command=closeResults)
root.mainloop()
IndexFrame.py(如果要运行此程序,可能必须删除Lucene代码,除非已安装PyLucene)
我也很高兴得到Python的一般建议。我在构建涉及多个文件/类的Python应用程序方面没有太多经验,因此我确信我做了很多错误的事情(特别是我没有正确地进行子分类)
谢谢。使用.place()
管理器
.place()
管理器是tkinter中的三个几何体管理器之一
它有很多论点,但我认为你可能需要3个
第一个是relheight
。这表示“相对高度”,并且,顾名思义,它设置了小部件相对于主小部件高度的高度
例如,如果将relheight
参数设置为0.6,则将其设置为的小部件高度将保持为主小部件高度的60%
第二个参数是relwidth
。这个函数的工作方式与relheight
相同,只是处理宽度而不是高度
最后一个是anchor
。这一个没有前两个有用,但在某些情况下它非常方便<代码>定位设置放置的位置。例如,如果anchor
为“中心”,则在place函数中使用relx
和rely
指定的坐标将位于该小部件的中心
当然,这是一个非常基本的解释,但是文档中还介绍了其他参数,如relx
和rely
阅读更多关于这个地方的信息
希望这有帮助 请提供一个答案,您的问题中似乎有很多不相关的代码。请尝试将代码减少到复制问题所需的最少行。请继续阅读,而不是
.grid()
from tkinter import *
from tkinter import filedialog
from tkinter.ttk import *
from tkinterhtml import HtmlFrame
import lucene
from lucene import *
from java.io import File
from java.lang import Integer
from org.apache.lucene.analysis.standard import StandardAnalyzer
from org.apache.lucene.index import IndexReader, DirectoryReader
from org.apache.lucene.search import IndexSearcher, BooleanClause
from org.apache.lucene.queryparser.classic import MultiFieldQueryParser
from org.apache.lucene.store import FSDirectory
from ScrollText import ScrollText
class IndexFrame(Frame):#(PanedWindow):
def __init__(self, parent, dirPath):
Frame.__init__(self, parent)
lucene.initVM()
analyzer = StandardAnalyzer()
indexPath = File(dirPath).toPath()
indexDir = FSDirectory.open(indexPath)
reader = DirectoryReader.open(indexDir)
searcher = IndexSearcher(reader)
self.grid_propagate(0)
queryFrame = Frame(self)
queryFrame.grid(row=0, column=0, sticky='nsw')
self.resultsTabs = Notebook(self)
self.resultsTabs.grid(row=0, column=1, sticky='nesw')
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(1, weight=3)
label = Label(queryFrame, text="Contains " + str(reader.numDocs()) + " indexed documents")
label.grid(row=0, column=0, columnspan=3, sticky='nesw')
text = ScrollText(queryFrame)
text.grid(row=2, column=0, columnspan=3, sticky='nesw')
def save_btn():
fname = filedialog.asksaveasfilename(title="Save query", filetypes=(("text files", "*.txt"),))
if fname:
file = open(fname, 'w')
file.write(text.text.get('1.0', 'end'))
file.close()
save = Button(queryFrame, text='Save', command=save_btn)
save.grid(row=1, column=0, sticky='ew')
def load_btn():
fname = filedialog.askopenfilename(title="Load query", filetypes=(("text files", "*.txt"),))
if fname:
text.text.delete('1.0', 'end')
file = open(fname, 'r')
text.text.insert('1.0', file.read())
file.close()
load = Button(queryFrame, text='Load', command=load_btn)
load.grid(row=1, column=1, sticky='ew')
def clear_btn():
text.text.delete('1.0', 'end')
clear = Button(queryFrame, text='Clear', command=clear_btn)
clear.grid(row=1, column=2, sticky='ew')
def search_btn():
queryText = text.text.get('1.0', 'end')
fields =["title", "abstract", "keywords"]
flags = [BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD]
query = MultiFieldQueryParser.parse(queryText, fields, flags, analyzer)
docs = searcher.search(query, Integer.MAX_VALUE)
tab = Frame(self.resultsTabs)
resultsLabel = Label(tab, text="{} => {} results".format(queryText, len(docs.scoreDocs)))
resultsLabel.grid(row=0, column=0, sticky='ew')
htmlText = HtmlFrame(tab, vertical_scrollbar="auto")
htmlText.grid(row=1, column=0, sticky='nesw')
html = "<html>"
doc = searcher.doc(docs.scoreDocs[0].doc)
html += "<h2>Title: {}</h2></br>".format(doc.getField("title").stringValue())
#html += "<h4>Abstract: {}</h4></br>".format(doc.getField("abstract").stringValue())
html += "</html>"
htmlText.set_content(html)
self.resultsTabs.add(tab, text=str(len(docs.scoreDocs)))
search = Button(queryFrame, text='Search', command=search_btn)
search.grid(row=3, column=0, columnspan=3, sticky='ew')
queryFrame.grid_rowconfigure(0, weight=0)
queryFrame.grid_rowconfigure(1, weight=0)
queryFrame.grid_rowconfigure(2, weight=1)
queryFrame.grid_rowconfigure(3, weight=0)
queryFrame.grid_columnconfigure(0, weight=1)
queryFrame.grid_columnconfigure(1, weight=1)
queryFrame.grid_columnconfigure(2, weight=1)
def closeResults(self):
self.resultsTabs.forget(self.resultsTabs.index('current'))
from tkinter import *
from tkinter.ttk import *
class ScrollText(Frame):
def __init__(self, parent=None):
Frame.__init__(self, parent)
self.text = Text(self)
self.text.grid(row=0, column=0, sticky='nesw')
yscroll = Scrollbar(self, orient=VERTICAL, command=self.text.yview)
yscroll.grid(row=0, column=1, sticky='nesw')
self.text.configure(yscrollcommand=yscroll.set)
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(1, weight=0)