首页 文章

Python Tkinter滚动条问题

提问于
浏览
3

我正在接受一个奇怪的行为和 Tkinter scrollbar 的例外 . 我的GUI基本上使用了与滚动条相关/引用的Tkinter Text Widget .

self.textFrame = Tkinter.LabelFrame (self.mainFrame,padx=0,pady=0,width=200,height=100)
    self.textFrame.grid(row=5, column =1, sticky = "NW", padx = 5, pady = 10)
    self.consLable = Tkinter.Label (self.textFrame,text = "Log-Console:",font ="Verdana 8 bold")
    self.consLable.grid (row =6,column =1, sticky = "NW", padx = 5, pady = 1)
    self.consText= Tkinter.Text(self.textFrame, wrap = "word")
    self.consText.grid(row =7,column =1, rowspan =4)
    self.consText.tag_configure("stderr", foreground="#b22222")
    self.scrollText= Tkinter.Scrollbar(self.textFrame,command = self.consText.yview)
    self.scrollText.grid(row =7,column =2,rowspan =4,sticky='NSEW')
    self.consText.config(yscrollcommand = self.scrollText.set)

    # Referencing output location of the console "print or sys.stderr" methods
    sys.stdout = gemeindesteckbrief__SupportTools__.TextRedirector(self.consText, "stdout")
    sys.stderr=  gemeindesteckbrief__SupportTools__.TextRedirector(self.consText, "stderr")

在Text Widget本身中,使用 sys.stdoutsys.stderr 插入python控制台条目 . 要插入文本,使用支持类覆盖 .sys.stderr.writeprint 方法并将文本写入Tkinter文本小部件 .

class TextRedirector(object):
def __init__(self,widget, tag):
    self.targetwidget = widget
    self.targettag = tag

#@Override the sys.stdout & sys.stderr methods to write to the text widget instead of the python console
def write(self, str):
    self.targetwidget.configure(state="normal")
    self.targetwidget.insert("end", str, (self.targettag,))
    self.targetwidget.configure(state="disabled")

将文本插入Text Widget按预期工作,同时单击Widget并使用鼠标滚轮滚动工作正常,同时使用滚动条工作的向上和向下按钮 . 所有麻烦都开始使用吧,并试图上下滑动 . 效果是 TclError: expected floating-point number but got "0,0028"

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python26\ArcGIS10.0\lib\lib-tk\Tkinter.py", line 1410, in __call__
return self.func(*args)
File "C:\Python26\ArcGIS10.0\lib\lib-tk\Tkinter.py", line 3156, in yview
self.tk.call((self._w, 'yview') + what)
TclError: expected floating-point number but got "0,0028"

1 回答

  • 1

    所以,我刚刚为我的问题找到了一种解决方法.Tkinter似乎在多线程方面存在问题 . 所以我只是将 Tkinter.Scrollbar 更改为 ttk.Scrollbar . ttk模块是Tkinter的扩展版本,解决了Tkinter模块的一些奇怪行为 .

    http://docs.python.org/3.1/library/tkinter.ttk.html

    更改小部件的模块后,一切都按预期工作!

    这个解决方案只是实际问题的解决方法,但它的工作原理!

相关问题