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,我试图在Tkinter中构建一个简单的UI,但遇到了一个问题。我在整个应用程序中创建了一个自定义框架对象作为笔记本中的选项卡,自定义框架定义了一个网格,其中左侧包含一组控件,右侧包含另一个笔记本。控制帧正确地设置为父帧宽度的三分之一,但笔记本开始时仅为宽度的一半。如果单击创建更多选项卡并将其添加到笔记本的按钮,笔记本的宽度将扩展,直到控制框无法使用为止。我如何定义东西,使控制帧始终精确地(比如)是父帧宽度的30%,笔记本是宽度的70%,即使父帧调整了大小 Root.py from tki

我试图在Tkinter中构建一个简单的UI,但遇到了一个问题。我在整个应用程序中创建了一个自定义框架对象作为笔记本中的选项卡,自定义框架定义了一个网格,其中左侧包含一组控件,右侧包含另一个笔记本。控制帧正确地设置为父帧宽度的三分之一,但笔记本开始时仅为宽度的一半。如果单击创建更多选项卡并将其添加到笔记本的按钮,笔记本的宽度将扩展,直到控制框无法使用为止。我如何定义东西,使控制帧始终精确地(比如)是父帧宽度的30%,笔记本是宽度的70%,即使父帧调整了大小

Root.py

    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)