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 pygubu tkinter文本滚动条_Python_User Interface_Tkinter - Fatal编程技术网

python pygubu tkinter文本滚动条

python pygubu tkinter文本滚动条,python,user-interface,tkinter,Python,User Interface,Tkinter,我对python并不陌生,但从未创建过GUI 需要为一些用户创建一个非常简单的GUI。 使用此构造函数创建基于xml的GUI标记 问题: 文本框的滚动条出现了,但从来没有起作用。尝试了很多教程,阅读了文档,在我看来,我做得不错(设置文本字段的yscrollcommand属性和滚动条的command) mainWindow.ui文件: <?xml version='1.0' encoding='utf-8'?> <interface> <object class=

我对python并不陌生,但从未创建过GUI

需要为一些用户创建一个非常简单的GUI。 使用此构造函数创建基于xml的GUI标记

问题: 文本框的滚动条出现了,但从来没有起作用。尝试了很多教程,阅读了文档,在我看来,我做得不错(设置文本字段的
yscrollcommand
属性和滚动条的
command

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>
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()

我手动设置它,它可以工作

scrollbar的问题是,您必须首先创建scrollbar和小部件,然后才能将它们分配给另一个

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()
当您创建小部件并且滚动条还不存在时,您不能将滚动条分配给小部件。当您创建scrollbar并且小部件还不存在时,您不能将小部件分配给scrollbar。因此,您必须首先创建一个对象,而不指定给第二个对象。接下来,可以创建第二个对象,并将其指定给第一个对象。然后,您可以将第一个对象指定给第二个对象。首先创建两个对象,然后再将一个对象分配给另一个对象,这样更具可读性

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()
将tkinter作为tk导入
进口皮古布
班级申请:
定义初始(自我,主):
self.builder=builder=pygubu.builder()
builder.add\u from\u文件('mainwindow.ui'))
self.mainwindow=builder.get\u对象('mainwindow',master)
#获取对象
self.logBox=builder.get\u对象('logBox',master)
self.yscrollbar=builder.get_对象('yscrollbar',master)
#将滚动条分配给文本小部件
#yscrollbar.set
#logBox.yview
self.logBox['yscrollcommand']=self.yscrollbar.set
self.yscrollbar['command']=self.logBox.yview
#为测试设置一些文本
对于范围(20)内的x:
self.logBox.insert('end','nHello World!')
如果名称=“\uuuuu main\uuuuuuuu”:
root=tk.tk()
app=应用程序(根)
root.mainloop()

如果.ui文件中接口的主要对象类是tk.Toplevel 可以这样声明类应用程序的init方法:

def __init__(self, master=None):
然后:

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

在代码中手动创建GUI-您将拥有更好的控制。