【问题标题】:How to use value from a text file with the `set` method of a tkinter Scale widget?如何通过 tkinter Scale 小部件的“set”方法使用文本文件中的值?
【发布时间】:2013-12-27 17:00:13
【问题描述】:

我创建了一个保存 2 个滑块值的文件。现在,我希望能够从这个文件中调用值来设置滑块的值。

这是我当前的代码:

from tkinter import *
import os.path
master= Tk()
master.geometry('500x500+0+0')



def print_value(val):
    print ("c1="+str (c1v.get()))
    print ("c2="+str(c2v.get()))


c1v=DoubleVar()
c2v=DoubleVar()

c1 = Scale(master, from_=255, to=0, length =400,width =100, troughcolor = 'blue',command=print_value, variable =c1v)
c1.grid(row=1,column=1)
c2 = Scale(master, from_=255, to=0, length =400,width =100, troughcolor = 'blue',command=print_value, variable =c2v)
c2.grid(row=1,column=2)

def record():

    save_path = 'C:/Users/Josh Bailey/Desktop/pi_dmx'
    name_of_file = ("my first file ")
    completeName = os.path.join(save_path, name_of_file+".txt")
    file1 = open(completeName , "w")
    toFile = ("c1="+str (c1.get())+ "\n""c2="+str(c2.get()))
    file1.write(toFile)
    file1.close()
    master.mainloop()

rec=Button(master, text="Record",width=20, height=10, bg='Red', command=record)
rec.grid(row=2, column=3)

load=Button(master, text="Load",width=20, height=10, bg='gold')
load.grid(row=2, column=4)

【问题讨论】:

    标签: python tkinter save load tkinter-scale


    【解决方案1】:

    您可以像这样设置滑块的值:

    c1.set(100) #sets value to 100

    所以只需读取一个文本文件并将我的示例中的 100 替换为文件中的值:

    代码:

    try:
        f = open("my first file.txt")
        for each_line in f:
            (slider, value) = each_line.split("=")
            if slider == "c1":
                saved_c1 = value
            if slider == "c2":
                saved_c2 = value
    except FileNotFoundError:
        pass
    
    c1.set(saved_c1)
    c2.set(saved_c2)
    

    您的文件名(我的第一个文件)后面还有一个尾随空格。最好摆脱它。

    【讨论】:

      【解决方案2】:

      您需要创建一个函数来从文件中取出数据,然后将该函数连接到load

      按照你的风格,函数应该是这样的:

      def func():
      
          save_path = 'C:/Users/Josh Bailey/Desktop/pi_dmx'
          name_of_file = ("my first file ")
          completeName = os.path.join(save_path, name_of_file+".txt")
          file1 = open(completeName)
          val1, val2 = (x.split("=")[1] for x in file1)
          c1v.set(val1)
          c2v.set(val2)
          file1.close()
      

      然后您可以使用按钮的command 选项将其连接到load

      load=Button(master, text="Load",width=20, height=10, bg='gold', command=func)
      load.grid(row=2, column=4)
      

      总而言之,代码应该是这样的:

      from tkinter import *
      import os.path
      master= Tk()
      master.geometry('500x500+0+0')
      
      
      
      def print_value(val):
          print ("c1="+str (c1v.get()))
          print ("c2="+str(c2v.get()))
      
      
      c1v=DoubleVar()
      c2v=DoubleVar()
      
      c1 = Scale(master, from_=255, to=0, length =400,width =100, troughcolor = 'blue',command=print_value, variable =c1v)
      c1.grid(row=1,column=1)
      c2 = Scale(master, from_=255, to=0, length =400,width =100, troughcolor = 'blue',command=print_value, variable =c2v)
      c2.grid(row=1,column=2)
      
      def record():
      
          save_path = 'C:/Users/Josh Bailey/Desktop/pi_dmx'
          name_of_file = ("my first file ")
          completeName = os.path.join(save_path, name_of_file+".txt")
          file1 = open(completeName , "w")
          toFile = ("c1="+str (c1.get())+ "\n""c2="+str(c2.get()))
          file1.write(toFile)
          file1.close()
          master.mainloop()
      
      rec=Button(master, text="Record",width=20, height=10, bg='Red', command=record)
      rec.grid(row=2, column=3)
      
      #################################################################
      def func():
      
          save_path = 'C:/Users/Josh Bailey/Desktop/pi_dmx'
          name_of_file = ("my first file ")
          completeName = os.path.join(save_path, name_of_file+".txt")
          file1 = open(completeName)
          val1, val2 = (x.split("=")[1] for x in file1)
          c1v.set(val1)
          c2v.set(val2)
          file1.close()
      
      load=Button(master, text="Load",width=20, height=10, bg='gold', command=func)
      load.grid(row=2, column=4)
      ###################################################################
      record()
      

      另外,只是一个提示:您应该在打开文件时使用 Python 的 with-statement。它会自动为您关闭它们。

      【讨论】:

      • 我尝试使用您的代码,但收到以下错误:FileNotFoundError: [Errno 2] 没有这样的文件或目录,该文件肯定在那里,我可以看到它并且路径已从创建文件的部分。为什么我会收到此错误?继承人的代码。 def func(): pass file1 = open("C:/Users/Josh Bailey/Desktop/pi_dmx/preset_test.txt") val1, val2 = (x.split("=")[1] for x in file1) c1 .set(val1) c2.set(val2) file1.close()
      • @user2996828 - 有两件事可能是问题所在。 1) 我在您的代码中看到了pass。那不应该在那里。 2) 您的代码正在使用preset_test.txt,但您的其他函数正在创建一个名为my first file .txt 的文件。请参阅我的编辑。我添加了完整代码的样子。它应该可以工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多