Python Tkinter滚动条问题

3
我遇到了一些关于Tkinter滚动条的奇怪行为和异常。我的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.stdout` 和 `sys.stderr` 插入 Python 控制台输入。为了插入文本,使用了一个支持类,该类覆盖了 `.sys.stderr.write` 或 `print` 方法,并将文本写入 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")

将文本插入到文本小部件中的操作如预期一样工作,同时点击小部件并使用鼠标滚轮进行滚动也可以正常工作,还可以使用滚动条的上下按钮。所有的问题都是在使用滚动条并尝试上下滑动时开始的。出现的错误是TclError: 期望浮点数但得到“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"

听起来像是一个数字被本地的小数点(,)格式化了。 - Johannes Kuhn
如果你将 self.scrollText.set 改为 lambda s: self.scrollText.set(s.replace(',', '.')),会有什么变化吗?也许你需要包装这些方法。但我不知道为什么会出现错误。 - User
这里涉及到的Python、Tkinter、Tk和Tcl的确切版本是什么? - Donal Fellows
Python版本2.6.5;Tkinter - Version =“$ Revision:73770 $” TCL可能是8.5...我不确定! - freeski_52
1个回答

1
所以,我刚刚找到了一种解决我的问题的方法。Tkinter似乎存在多线程问题。所以我只是将更改为。ttk模块是Tkinter的扩展版本,并解决了Tkinter模块的某些奇怪行为。请参考http://docs.python.org/3.1/library/tkinter.ttk.html。更改小部件的模块后,一切都按预期工作!这个解决方案只是实际问题的权宜之计,但它有效!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接