极简日志人机交互版制作日志
  • 操作系统:windows8.1

  • 此版本为Week2的作业,要求使用Tkinter作为GUI的工具制作“极简日志”

  • 学习Tkinter是一个全新的过程,我大概花了3-4天的时间才大概读懂几个documentation,然后学会搭框架。
  • 在人机交互界面下,程序出错的可能增加,debug的难度增大,中途崩溃,休息了两三天。
  • 随后参考了同学作业如
  • 几个槛

    • 对于Tkinter的基本理解

      • 基本框架,采用以下方式编写框架

          class Application(Frame):
              def __init__(self, master=None) #设计主面吧
              self.grid() #使主面板出现,grid为使用格子方式布局控件
              self.creat_widgets() #所有控件,见下
        
              def creat_widgets(self):
                  self.text1 = Text(self) #文本框1
                  self.tex1.grid() #在主面板上布局文本框1
                  self.text2 = Text(self) #文本框2
                  self.text2.grid() #布局文本框2
        
          app = Application() # create the application
          app.master.title('SimpleLog') #name appears at the top
          app.mainloop()    #运行
        
      • grid是布局空间的万能形式,它使用格子形式布局。从左到右分别为column0,1,2……,从上到下分别为row0,1,2,……。每一个控件占一个格子,不分大小。因此只要将控件在纸上布局好,就可以按照它们的位置编号,并运行grid()
      • event:发生事件(如击回车)导致控件改变。我的问题是没有找到在“一个控件单击回车,使另一个控件打印文本”的方法。后来参照bambooom的编译,发现我function写错了地方。我写在class外面,改成写在class内部后不再出错。
    • write()出错(文件打开方式为'r+'
      • 错误为error 0
      • 以 python write() error 0 为关键词,发现stackflow里有人遭遇了类似的错误。
      • 查看讨论,发现有人提到read和write语句一起出现时会出现报错,原因不详。于是尝试把read的语句往上提,在程序最初出现,并赋值给一个变量,问题解决。
      • 比较三个版本:
        • 版本1(CLI,more为单次输入语句):
                  ori = txt.read()
                  txt.write(ori)
                  txt.write('\n')
                  txt.write(more)
          
        • 版本2(CLI,content为程序结束前所有新增语句)
                  txt.read()
                  txt.write(content)
          
        • 版本3(GUI,content为文档原有内容+所有新增语句)
                  txt = open('simplelog.txt', 'r+')
                  global content            #| content = txt.read() 
                  content = content + more 
                  txt.write(content)
          
        • 1/2都是read write一起出现,无报错。3(当为#后语句)则报错。
        • 1/3 read后,write是从第一行开始的(覆盖原文件),而2却是继文件尾续写。
        • 不知何故。需要进一步观察。
    • GUI界面输入中文报错
      • 直接参考了两位同学的语句。
          import sys
          reload(sys)
          sys.setdefaultencoding('utf8')
        
    • 另版本2中将语句中的True改为1也会出错
          while True:
              more = raw_input('>:')
              if more == "q()":
                  break
              else:
              content += '\n'+ more
      
      • 没有出错提示,但会漏掉输入的句子:输入两句,漏掉一句。需要进一步观察。