免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 21306 | 回复: 10
打印 上一主题 下一主题

怎样在Tkinter中将函数处理过的结果返回至Text中显示 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-15 15:18 |只看该作者 |倒序浏览
刚才发了一个帖子,但是发完觉得那个应该不是问题的真正所在,现在的需求是在上面一个Text(Text2)中输入一个字符串,然后用函数处理这个字符串(比如说反转),然后在下面的Text(Text4)中输出显示出反转字符串的结果,代码如下:
#!/usr/bin/env python
#-*- coding:utf-8 -*-

from Tkinter import *
from tkFont import Font
from ttk import *
#Usage:showinfo/warning/error,askquestion/okcancel/yesno/retrycancel
from tkMessageBox import *
#Usage:f=tkFileDialog.askopenfilename(initialdir='E:/Python')
#import tkFileDialog
#import tkSimpleDialog

class Application_ui(Frame):
    #这个类仅实现界面生成功能,具体事件处理代码在子类Application中。
    def __init__(self,master=None):
        Frame.__init__(self, master)
        self.master.geometry('905x397')
        self.createWidgets()
        

    def createWidgets(self):
        self.top = self.winfo_toplevel()

        self.style = Style()

        self.style.configure('TCommand1.TButton', background='#FFFFFF', font=('Times New Roman',12,'bold'))
        self.Command1 = Button(self.top, text='Reverse', command=self.rever, style='TCommand1.TButton')
        self.Command1.place(relx=0.368, rely=0.846, relwidth=0.134, relheight=0.103)

        self.Text2Var = StringVar(value='')
        self.style.configure('TText2.TEntry', background='#C0C0C0')
        self.Text2 = Entry(self.top, textvariable=self.Text2Var, style='TText2.TEntry')
        self.Text2.place(relx=0.009, rely=0.181, relwidth=0.985, relheight=0.103)

        self.Text4Var = StringVar(value='')
        self.style.configure('TText4.TEntry', background='#C0C0C0')
        self.Text4 = Entry(self.top, textvariable=self.Text4Var, style='TText4.TEntry')
        self.Text4.place(relx=0.009, rely=0.645, relwidth=0.985, relheight=0.123)


class Application(Application_ui):
    #这个类实现具体的事件处理回调函数。界面生成代码在Application_ui中。
    def __init__(self,master=None):
        Application_ui.__init__(self, master)

    def rever():
        pass

if __name__ == "__main__":
    top = Tk()
    Application(top).mainloop()
    try: top.destroy()
    except: pass
————————————————————————————————————————————————————————————————————————————————————
请给位大神帮忙指教一下,怎么来处理Text4的textvariable,才能显示出反转后的字符串!

————————————————————————————————————————————————————————————————————————————————————
PS:还要感谢cdhigh提供的VisualTkinter

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
2 [报告]
发表于 2013-01-15 16:19 |只看该作者
本帖最后由 ssfjhh 于 2013-01-15 16:19 编辑
  1. self.Text4.delete(1.0, END)
  2. self.Text4.insert(1.0, self.Text2Var.get()[::-1])
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-01-15 16:47 |只看该作者
ssfjhh 发表于 2013-01-15 16:19

我加上这个语句后,报错:
Traceback (most recent call last):
  File "C:\Python27\Lib\site-packages\Pythonwin\pywin\framework\scriptutils.py", line 326, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Python27\test\parse gv200 hex report_8.py", line 3161, in <module>
    Application(top).mainloop()
  File "C:\Python27\test\parse gv200 hex report_8.py", line 68, in __init__
    Application_ui.__init__(self, master)
  File "C:\Python27\test\parse gv200 hex report_8.py", line 24, in __init__
    self.createWidgets()
  File "C:\Python27\test\parse gv200 hex report_8.py", line 49, in createWidgets
    self.Text4.delete('1.0', END)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 2388, in delete
    self.tk.call(self._w, 'delete', first, last)
TclError: bad entry index "1.0"

还有就是你是用切边操作符来进行反转的,如果我要通过调用函数的方法来处理应该怎么写呢?

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
4 [报告]
发表于 2013-01-15 19:08 |只看该作者
回复 3# young_py

在我电脑上没有错误。
有这个操作更方便为什么不用?
这个如果不会,你需要打好基本功。

   

论坛徽章:
0
5 [报告]
发表于 2013-01-15 20:52 |只看该作者
self.Text4.delete('1.0', END)当然会报错,只有Text控件(多行文本框)才支持类似'1.0'的索引,你的Text4是Entry,是单行文本框,
设置单行文本框的方法很简单,不是有textvariable变量吗?操作此变量即可,一个set()一个get()。
self.Text4Var.set(self.Text2Var.get()[::-1])

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
6 [报告]
发表于 2013-01-15 21:08 |只看该作者
回复 5# cdhigh

失误,没有看清楚,他用的是entry控件

   

论坛徽章:
0
7 [报告]
发表于 2013-01-16 10:14 |只看该作者
回复 5# cdhigh
非常感谢你的回复,采用你的方法后,程序运行没有报错,但是我在Text2中输入字符串,并没有在Text4中反转显示出来,这是为什么呢?
还有如果我需要通过调用函数revert(),来对Text2Var的值进行操作,应该怎么写这行代码?

——————————————————————————————————————————————————————————————————————————————————

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from Tkinter import *
from tkFont import Font
from ttk import *
#Usage:showinfo/warning/error,askquestion/okcancel/yesno/retrycancel
from tkMessageBox import *
#Usage:f=tkFileDialog.askopenfilename(initialdir='E:/Python')
#import tkFileDialog
#import tkSimpleDialog

class Application_ui(Frame):
    #这个类仅实现界面生成功能,具体事件处理代码在子类Application中。
    def __init__(self,master=None):
        Frame.__init__(self, master)
        self.master.geometry('905x397')
        self.createWidgets()
        

    def createWidgets(self):
        self.top = self.winfo_toplevel()
        

        self.style = Style()
        

        self.style.configure('TCommand1.TButton', background='#FFFFFF', font=('Times New Roman',12,'bold'))
        self.Command1 = Button(self.top, text='Reverse', command=self.rever, style='TCommand1.TButton')
        self.Command1.place(relx=0.368, rely=0.846, relwidth=0.134, relheight=0.103)
        

        self.Text2Var = StringVar()     
        self.style.configure('TText2.TEntry', background='#C0C0C0')     
        self.Text2 = Entry(self.top, textvariable=self.Text2Var, style='TText2.TEntry')
        self.Text2.place(relx=0.009, rely=0.181, relwidth=0.985, relheight=0.103)

   
        self.Text4Var = StringVar()
        self.Text4Var.set(self.Text2Var.get()[::-1])
        self.style.configure('TText4.TEntry', background='#C0C0C0')
        self.Text4 = Entry(self.top,textvariable=self.Text4Var,style='TText4.TEntry')
        self.Text4.place(relx=0.009, rely=0.645, relwidth=0.985, relheight=0.123)



class Application(Application_ui):
    #这个类实现具体的事件处理回调函数。界面生成代码在Application_ui中。
    def __init__(self,master=None):
        Application_ui.__init__(self, master)

    def rever():
        pass

if __name__ == "__main__":
    top = Tk()
    Application(top).mainloop()
    try: top.destroy()
    except: pass   

论坛徽章:
0
8 [报告]
发表于 2013-01-16 21:02 |只看该作者
1.要放在一个命令按钮的回调函数中执行self.Text4Var.set(self.Text2Var.get()[::-1])
我看你将此行代码放在createWidgets(),当然不行的啦

如果你希望在Text2中一边输入文件,Text4马上就能显示反转后的字符串,则需要给Text2Var设置一个监视器,这样Text2Var有任何变化,监视器马上回调你设置的函数,类似于VB里面的Text2_Change()事件。
你也可以通过VisualTkinter来自动实现,就是在VB窗体上双击Text2,代码窗体将增加一个Text2_Change()事件函数,Ctrl-S 保存,然后执行VisualTkinter,则在Application类中自动生成另一个回调函数:def Text2_Change(self, *args),将语句
self.Text4Var.set(self.Text2Var.get()[::-1])
放在此函数中即可。

2.至于怎么写rever()函数将字符串反转,就有很多很多种方法了,比如,这里举一些例子:
1.使用栈结构,字符依次进栈,然后再出栈即可。
2.使用链表,按字符为单位构造一个链表,然后遍历即可。
3.将字符一个一个写入文件,然后读出。
4.将字符一个一个写入一个缓存,然后读出。
5.每次取一个字符,插入一个新的字符串的头部。
还有很多很多方法,当然,最简单就是使用切片方法。

论坛徽章:
0
9 [报告]
发表于 2013-01-18 11:00 |只看该作者
回复 8# cdhigh
十分感谢你的回答,我现在还是刚刚入门级的菜鸟,你说的东西我只能说大概都明白,但是具体自己操作的时候,却还是出错,就拿你回答的第一点来举例,我是这样添加的:
———————————————————————————————————————————————————————————————————————————————
#!/usr/bin/env python
#-*- coding:utf-8 -*-

from Tkinter import *
from tkFont import Font
from ttk import *
#Usage:showinfo/warning/error,askquestion/okcancel/yesno/retrycancel
from tkMessageBox import *
#Usage:f=tkFileDialog.askopenfilename(initialdir='E:/Python')
#import tkFileDialog
#import tkSimpleDialog

class Application_ui(Frame):
    #这个类仅实现界面生成功能,具体事件处理代码在子类Application中。
    def __init__(self,master=None):
        Frame.__init__(self, master)
        self.master.geometry('905x397')
        self.createWidgets()
        

    def createWidgets(self):
        self.top = self.winfo_toplevel()
        

        self.style = Style()
        
        self.Text2Var = StringVar()     
        self.style.configure('TText2.TEntry', background='#C0C0C0')     
        self.Text2 = Entry(self.top, textvariable=self.Text2Var, style='TText2.TEntry')
        self.Text2.place(relx=0.009, rely=0.181, relwidth=0.985, relheight=0.103)
   


        self.style.configure('TCommand1.TButton', background='#FFFFFF', font=('Times New Roman',12,'bold'))
        self.Command1 = Button(self.top, text='Reverse', command=self.rever, style='TCommand1.TButton')
        self.Command1.place(relx=0.368, rely=0.846, relwidth=0.134, relheight=0.103)


        self.Text4Var = StringVar()   
        self.style.configure('TText4.TEntry', background='#C0C0C0')
        self.Text4 = Entry(self.top,textvariable=self.Text4Var,style='TText4.TEntry')
        self.Text4.place(relx=0.009, rely=0.645, relwidth=0.985, relheight=0.123)



class Application(Application_ui):
    #这个类实现具体的事件处理回调函数。界面生成代码在Application_ui中。
    def __init__(self,master=None):
        Application_ui.__init__(self, master)

    def rever():
        return self.Text4Var.set(self.Text2Var.get()[::-1])
         
if __name__ == "__main__":
    top = Tk()
    Application(top).mainloop()
    try: top.destroy()
    except: pass   
————————————————————————————————————————————————————————————————————————————

但是程序跑起来后,报错了:
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
TypeError: rever() takes no arguments (1 given)


由于自己对面向对象编程比较陌生,我不是很清楚改怎么去改!


还有就是其实我想做的并不是说在Text2中输入,然后在Text4中实时的显示出反转的结果,我想做的是在Text2中输入一个字符串,然后点击Button "Reverse",再将反转的结果输出到Text4中,其实很简单的功能,但是却总是出现各种问题,还请明示,十分感谢!
   

论坛徽章:
0
10 [报告]
发表于 2013-01-18 19:29 |只看该作者
仅需要在rever()函数增加参数self
类中的成员函数第一个参数必须是类引用,惯例一般命名为self。
self参数由python自动传递,自己不用关心。

def rever(self):
        self.Text4Var.set(self.Text2Var.get()[::-1])
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP