【问题标题】:How to make correct file save in tkinter如何在 tkinter 中保存正确的文件
【发布时间】:2019-10-01 04:11:42
【问题描述】:

这个想法是当用户启动循环程序时,它必须生成一个文件,并将一些数据保存到其中。因此,用户输入号码,选择目录,然后程序启动。但是每次循环计数都有一些问题。它要求再次选择一个目录,然后它继续 TypeError。

from tkinter import *
from tkinter import ttk
from tkinter import filedialog
import os
import datetime
import csv
import threading


class Application(Frame):
    def __init__(self, master):
        super().__init__(master)
        self.master = master
        self.mainframe = ttk.Frame(master, padding='5 5 10 10')
        self.mainframe.grid(column=0, row=0, sticky=N + S + W + E)
        self.measureFrame()
        self.connectionConf()
        self.meas()

    def connectionConf(self):
        self.confFrame = ttk.Frame(self.mainframe, padding='5 5 10 10').grid(column=0, row=3)
        self.confFreq = Label(self.confFrame, text='Number:')
        self.confFreq.grid(column=1, row=4, pady=5, stick=W)
        self.freqSet = Entry(self.confFrame, width=6)
        self.freqSet.grid(column=2, row=4, pady=5, stick=W)

    def measureFrame(self):
        self.name = StringVar()
        self.mesFrame = ttk.Frame(self.mainframe, padding='5 5 10 10').grid(column=0, row=5)
        self.mesHeader = Label(self.mesFrame, text='Path to save', font=10).grid(column=1, row=5, columnspan=2
                                                                                         , pady=10, stick=W)
        self.ent1 = Entry(self.mesFrame, textvariable=self.name, width=50)
        self.ent1.grid(column=1, row=7, columnspan=3, pady=5, stick=W)
        self.button1 = Button(self.mesFrame, text='Open', command=self.browseButton)
        self.button1.grid(column=4, row=7, pady=5, stick=W)

    def browseButton(self):
        filedir = filedialog.askdirectory()
        filedir = self.name.set(filedir)
        return filedir

    def meas(self):
        self.mesframe = ttk.Frame(self.mainframe, padding='5 5 10 10').grid(column=0, row=8)
        self.startb = Button(self.mesframe, text='Start',
                             command=lambda: threading.Thread(target=self.startMeas).start())
        self.startb.grid(column=1, row=10, pady=5, stick=W)

    def filename_gen(self):
        basename = self.freqSet.get()
        suffix = datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S')
        filetype = '.csv'
        genfile = '_'.join([suffix, basename, filetype])
        ressfile = os.path.join(self.browseButton(), genfile)
        return ressfile

    def startMeas(self):
        with open(self.filename_gen(), 'a', newline='') as marks_csv:
            cur_mark = 'None'
            marks_wr = csv.writer(marks_csv)
            marks_wr.writerow(cur_mark)
        self.after(1000, self.startMeas)


window = Tk()
window.geometry('700x600')
app = Application(master=window)
app.columnconfigure(0, weight=1)
app.rowconfigure(0, weight=1)
app.mainloop()
window.quit()


【问题讨论】:

  • 从循环你主要的 app.loop() 东西?
  • 不,它的 .after() 循环。
  • 当你第一次调用 startMeas 时,它会进入一个递归定时循环。因此,每个呼叫都会启动自己的计时器,然后变得混乱,因为每个计时器都会启动更多呼叫,然后再启动自己的计时器。
  • 虽然我必须检查一下,但我很确定这是你的问题。
  • 好吧,虽然这不是主要问题(阅读下面的答案),但我仍然认为你应该看看递归的东西。

标签: python python-3.x user-interface tkinter


【解决方案1】:

在第 53 行,您再次调用 self.browsebutton改为将其替换为 self.name.get(),您的代码就可以正常工作了。

问题是您再次调用该函数,而不是使用上次选择目录时已经存储在字符串 var 中的预设名称。

我的意思是,这一行:

ressfile = os.path.join(self.browsebutton(), genfile)

应该替换为:

ressfile = os.path.join(self.name.get(), genfile)

【讨论】:

  • 谢谢!这对我有帮助。但现在我面临其他问题。它在每次循环计数时创建一个新文件,而不是写入一个文件。我想我需要打电话给filename_gen()
  • 很高兴它对您有所帮助,并尝试自己先解决上述问题,然后如果这对您不起作用,欢迎您再次提问,甚至扩展此线程但是我不建议这样做。
猜你喜欢
  • 2021-11-23
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 2021-09-26
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多