简体   繁体   English

python pygubu tkinter文本滚动条

[英]python pygubu tkinter text scrollbar

I'm not very new to python, but never created a GUI. 我对python不太陌生,但从未创建过GUI。

Need to create a very simple GUI for some scraper. 需要为某些刮板创建一个非常简单的GUI。 Used this constructor https://github.com/alejandroautalan/pygubu to make a xml-based GUI markup. 使用此构造函数https://github.com/alejandroautalan/pygubu进行基于xml的GUI标记。

Problem: Scrollbar for the textbox appear but never work. 问题: 文本框的滚动条出现,但无法使用。 Tried pretty much of tutorials, read docs, it seems to me that i'm doing all right (setting yscrollcommand property for text field and command for scrollbar). 试过几乎教程,阅读文档,在我看来,我做(设置没事yscrollcommand文本字段和属性command的滚动条)。

mainWindow.ui file: mainWindow.ui文件:

<?xml version='1.0' encoding='utf-8'?>
<interface>
  <object class="ttk.Frame" id="mainWindow">
    <property name="height">200</property>
    <property name="width">200</property>
    <layout>
      <property name="column">0</property>
      <property name="propagate">True</property>
      <property name="row">0</property>
    </layout>
    <child>
      <object class="ttk.Label" id="lblKey">
        <property name="padding">0</property>
        <property name="text" translatable="yes">Keyword:</property>
        <property name="underline">0</property>
        <layout>
          <property name="column">0</property>
          <property name="padx">5</property>
          <property name="pady">8</property>
          <property name="propagate">True</property>
          <property name="row">0</property>
          <property name="sticky">nw</property>
        </layout>
      </object>
    </child>
    <child>
      <object class="ttk.Entry" id="input_keyword">
        <property name="text" translatable="yes">Input Keyword</property>
        <property name="width">50</property>
        <layout>
          <property name="column">1</property>
          <property name="pady">7</property>
          <property name="propagate">True</property>
          <property name="row">0</property>
          <property name="sticky">n</property>
        </layout>
      </object>
    </child>
    <child>
      <object class="ttk.Button" id="btnStart">
        <property name="text" translatable="yes">Search</property>
        <layout>
          <property name="column">2</property>
          <property name="padx">5</property>
          <property name="pady">5</property>
          <property name="propagate">True</property>
          <property name="row">0</property>
          <property name="sticky">ne</property>
        </layout>
      </object>
    </child>
    <child>
      <object class="tk.Text" id="logBox">
        <property name="height">10</property>
        <property name="text" translatable="yes">Logs:</property>
        <property name="width">50</property>
        <property name="yscrollcommand">yscrollbar.set</property>
        <layout>
          <property name="column">0</property>
          <property name="columnspan">3</property>
          <property name="padx">5</property>
          <property name="pady">5</property>
          <property name="propagate">True</property>
          <property name="row">1</property>
          <property name="rowspan">1</property>
          <property name="sticky">ew</property>
        </layout>
      </object>
    </child>
    <child>
      <object class="ttk.Scrollbar" id="yscrollbar">
        <property name="command">logBox.yview</property>
        <property name="orient">vertical</property>
        <layout>
          <property name="column">2</property>
          <property name="padx">5</property>
          <property name="pady">5</property>
          <property name="propagate">True</property>
          <property name="row">1</property>
          <property name="sticky">nse</property>
        </layout>
      </object>
    </child>
  </object>
</interface>

related python code: 相关的python代码:

class Application:
    def __init__(self, master):
        self.builder = builder = pygubu.Builder()
        builder.add_from_file('mainWindow.ui')

        self.mainwindow = builder.get_object('mainWindow', master)

if __name__ == "__main__":
    root = tk.Tk()
    app = Application(root)

    root.mainloop()

I set it manually and it works. 我手动设置它,它可以工作。

With scrollbar is this problem, that you have to first create scrollbar and widget, and after that you can assign one to another. 使用滚动条是这个问题,您必须首先创建滚动条和小部件,然后才能将其分配给另一个。

You can't assign scrollbar to widget when you create widget and scrollbar doesn't exist yet. 创建窗口小部件且滚动条尚不存在时,无法将滚动条分配给窗口小部件。 And you can't assign widget to scrollbar when you create scrollbar and widget doesn't exist yet. 而且,当您创建滚动条并且窗口小部件尚不存在时,您无法将窗口小部件分配给滚动条。 So you have to first create one object without assigning to second object. 因此,您必须首先创建一个对象而不分配给第二个对象。 Next you can create second object with assigning to first object. 接下来,您可以分配第二个对象来创建第二个对象。 And after that you can assign first object to second object. 然后,您可以将第一个对象分配给第二个对象。 It can be more readable to create first both objects and after that assign one to another. 首先创建两个对象,然后再将其分配给另一个对象,可能会更具可读性。

import tkinter as tk
import pygubu

class Application:

    def __init__(self, master):
        self.builder = builder = pygubu.Builder()
        builder.add_from_file('mainwindow.ui')

        self.mainwindow = builder.get_object('mainWindow', master)

        # get objects
        self.logBox = builder.get_object('logBox', master)
        self.yscrollbar = builder.get_object('yscrollbar', master)

        # assign scrollbar to text widget
        #<property name="yscrollcommand">yscrollbar.set</property>
        #<property name="command">logBox.yview</property>

        self.logBox['yscrollcommand'] = self.yscrollbar.set
        self.yscrollbar['command'] = self.logBox.yview

        # set some text for test
        for x in range(20):
            self.logBox.insert('end', '\nHello World!')


if __name__ == "__main__":
    root = tk.Tk()
    app = Application(root)
    root.mainloop()

if the main object class of the interface in the .ui file is tk.Toplevel it is possible to declare the init method of the class Application like that: 如果.ui文件中接口的主要对象类是tk.Toplevel,则可以这样声明Application类的init方法:

def __init__(self, master=None):

And then: 接着:

if __name__== '__main__':
    app = Application()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM