0

だから、私はTkinterで何かをする方法にもっと好奇心を持っています。必須ではありませんが、実装したいと思います。とにかく、私がやりたいのは、apSelectリストボックスの項目の1つが選択されたときに、ファイルのデータから入力される1つまたは2つのマルチリストボックスを作成することです(簡単にするために、プリセットからのものとだけ言いましょう)リスト。)これに加えて、apSelectで別のエントリが選択された場合にそれらを非表示にします。もう1つは、動的リストボックスで選択されたデータを取得することです(データが存在すると仮定します)。これがTkinterを利用しているコードです。本当に重要なのは、init_メソッド(おそらく動的生成用に設定できる場所)とgenerateメソッド(データをプルする必要がある場所)だけです。

class App:
    def __init__(self, master):
        dateFrame= Frame(master)
        dateFrame.pack()
        apSelectFrame = Frame(master)
        apSelectFrame.pack()
        entryFrame = Frame(master)
        entryFrame.pack()
        buttonFrame = Frame(master)
        buttonFrame.pack()

        Label(dateFrame, text="Period:").grid(row=0)
        self.period = Entry(dateFrame)
        self.period.grid(row=0, column=1)
        Label(dateFrame, text="Year:").grid(row=1)
        self.year = Entry(dateFrame)
        self.year.grid(row=1, column=1)

        Label(apSelectFrame, text="Select Report Type:").grid(row=0)
        self.apSelect = Listbox(apSelectFrame, selectmode=SINGLE, height=3)
        self.apSelect.grid(row=1)
        for item in ["Artists", "Publishers", "Both"]:
            self.apSelect.insert(END, item)
        self.allTheThings = IntVar()
        self.checkAll = Checkbutton(apSelectFrame, text="All?", variable=self.allTheThings)
        self.checkAll.grid(row=1, column=1)

        Label(entryFrame, text="Client Name: ").grid(row=0)
        self.client = Entry(entryFrame)
        self.client.grid(row=0, column=1)
        Label(entryFrame, text="Publisher Name: ").grid(row=1)
        self.pub = Entry(entryFrame)
        self.pub.grid(row=1, column=1)

        self.generateBt = Button(buttonFrame, text="Generate!", command=self.generate)
        self.generateBt.pack(side=LEFT)
        self.resetBt = Button(buttonFrame, text="Reset!", command=self.reset)
        self.resetBt.pack(side=LEFT)
        self.quitBt = Button(buttonFrame, text="Quit!", fg="red", command=buttonFrame.quit)
        self.quitBt.pack(side=LEFT)

    def fileChecker(self, filename):
        if(not os.path.isfile(filename)):
            return "Missing file: "+filename+"\n"

    def checkForFiles(self, srFilename):
        errorFlag = False
        errorReport = []    
        errorReport.append(self.fileChecker("albums.csv"))
        errorReport.append(self.fileChecker("clients.csv"))
        errorReport.append(self.fileChecker("composition_copyright_holders.csv"))
        errorReport.append(self.fileChecker("compositions.csv"))
        errorReport.append(self.fileChecker("copyright_holders.csv"))
        errorReport.append(self.fileChecker("track_compositions.csv"))
        #errorReport.append(self.fileChecker("track_copyright_holders.csv"))
        errorReport.append(self.fileChecker("tracks.csv"))
        errorReport.append(self.fileChecker("copyright_holders_previously_owed.csv"))
        errorReport.append(self.fileChecker("artist_override.csv"))
        errorReport.append(self.fileChecker(srFilename))
        if(errorFlag):
            tkMessageBox.showerror("Error",
                "Either select all or enter publisher name!")
        else:
            return

    def generate(self):
        #TODO File checker
        month = self.period.get()
        #month = 'q1'
        year = self.year.get()
        #year = '2012'
        clname = self.client.get()
        pubname = self.pub.get()
        report_type = self.apSelect.curselection()
        #report_type = '1'
        allTheThings = self.allTheThings.get()
        #allTheThings = True
        if len(month)==0:
            tkMessageBox.showerror("Error",
                "You forgot to enter a period!")
            return
        if len(year)==0:
            tkMessageBox.showerror("Error",
                "You forgot to enter a year!")
            return
        if len(report_type)==0:
            tkMessageBox.showerror("Error",
                "You forgot to select a report type!")
            return
        if report_type[0]=='0' and allTheThings==0 and clname=="":
            tkMessageBox.showerror("Error",
                "Either select all or enter a client name!")
            return
        if report_type[0]=='1' and allTheThings==0 and pubname=="":
            tkMessageBox.showerror("Error",
                "Either select all or enter publisher name!")
            return
        if report_type[0]=='2' and allTheThings==0 and clname=="" and pubname=="":
            tkMessageBox.showerror("Error",
                "Either select all or enter a client and publisher name!")
            return
        if(not os.path.exists("reports")):
            os.makedirs("reports")
        if(not os.path.exists('reports/'+month+'_'+year+'')):
            os.makedirs('reports/'+month+'_'+year)
        if(not os.path.exists('reports/'+month+'_'+year+'/artists')):
            os.makedirs('reports/'+month+'_'+year+'/artists')
        if(not os.path.exists('reports/'+month+'_'+year+'/publishers')):
            os.makedirs('reports/'+month+'_'+year+'/publishers')
        if(not os.path.exists('reports/'+month+'_'+year+'/artists/empty')):
            os.makedirs('reports/'+month+'_'+year+'/artists/empty')
        if(not os.path.exists('reports/'+month+'_'+year+'/publishers/empty')):
            os.makedirs('reports/'+month+'_'+year+'/publishers/empty')
        srFilename="sr1_"+month+"_"+year+".csv"
        self.checkForFiles(srFilename)
        tester=ACR_CALC()
        tester.calc(month, year, clname, pubname, report_type, allTheThings,srFilename)

    def reset(self):
        print "RESETING!"
        self.period.delete(0, END)
        self.year.delete(0, END)
        self.allTheThings.set(0)
        self.client.delete(0, END)
        self.pub.delete(0, END)
        self.apSelect.select_clear(0,END)

root = Tk()
app = App(root)
root.mainloop()
4

1 に答える 1

1

以下の例で行ったように、グリッド ジオメトリ マネージャーを使用すると、特定のイベントでウィジェットを簡単に表示/非表示にすることができます。

pack類似のpack_forget方法がありますが、ウィジェットが静止した専用フレームに限定されていない場合、同じ場所でウィジェットを非表示/再表示するのは少し難しいかもしれません。

このコードのウィジェットは、ボタンを押すと表示/非表示になりますが、Tkinter でイベントをバインドする方法を理解していれば、このメソッドを使用して任意のイベントでウィジェットを表示 (非表示) にすることができます (bindメソッド詳しくは)。

import Tkinter as tk

class App(tk.Frame):
    def __init__(self,master):
        tk.Frame.__init__(self,master)
        self.b=tk.Button(self,text='hide',command=self.hide)
        self.lbl=tk.Label(self,text="This is a label you can hide")
        self.b.grid(row=0,column=0)
        self.lbl.grid(row=0,column=1)

    def hide(self):
        self.lbl.grid_forget()
        self.b.config(command=self.show,text='show')

    def show(self):
        self.lbl.grid(row=0,column=1)
        self.b.config(command=self.hide,text='hide')

if __name__ == '__main__':
    root = tk.Tk()
    f=App(root)
    f.grid(row=0,column=0)
    root.mainloop()

ここで質問全体に答えたかどうかは完全にはわかりません-あなたの質問には整理すべきことがたくさんありました...他に質問がある場合はお知らせください...

于 2012-06-08T18:55:55.410 に答える