学校プロジェクト用の在庫システムを作成しようとしています。人々が食料品を自分が作るカテゴリーに入れることができるようになっています。他のウィンドウを閉じた後にTkinterのウィンドウを更新する方法:Python 3.5
1つの食品アイテムを追加できるカテゴリの一覧を表示するウィンドウを更新しようとするのが難しいです。
class AddTab:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 800, height = 480)
self.master.maxsize(width = 800, height = 480)
self.master.geometry('800x480+0+0')
self.label = tk.Label(self.master, text = 'ADD TO CATEGORY')
self.label.pack(anchor = 'n')
self.frame.pack()
catnames = open('categorynames.txt','r').read().splitlines()
for name in catnames:
addbutton = tk.Button(self.frame, text = '+1 '+name, width = 20, command = lambda name = name: self.addtocategory(name))
addbutton.pack()
addnewcat = tk.Button(self.frame, text = 'ADD NEW CATEGORY', width = 100, command = self.addnewcategory)
addnewcat.pack(anchor = 's')
このコードは、メインループ切り替えスイッチです。
def main():
root = tk.Tk()
app = MainMenu(root)
root.geometry('800x480+0+0')
root.mainloop()
if __name__ == '__main__':
main()
これは、AddTabウィンドウに表示される新しいカテゴリを追加するウィンドウのコードです。私は新しい名前を入力すると
class NewCategory:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 400, height = 240)
self.master.maxsize(width = 400, height = 240)
self.master.geometry('400x240+0+0')
self.label = tk.Label(self.frame, text = 'ADD NEW CATEGORY')
self.label.grid(row = 1, column = 1, columnspan = 2)
self.newcatentry = tk.Entry(self.frame, width = 50)
self.newcatentry.grid(row = 2, column = 1, columnspan = 2)
quitbutton = tk.Button(self.frame, text = 'QUIT', width = 25, command = self.closewindow)
quitbutton.grid(row = 3, column = 1)
enterbutton = tk.Button(self.frame, text = 'ENTER', width = 25, command = self.entryget)
enterbutton.grid(row = 3, column = 2)
self.frame.grid(row = 0, column = 0)
def entryget(self):
entrydata = self.newcatentry.get()
catnameopen = open('categorynames.txt','a')
catnameopen.write(entrydata+'\n')
catnameopen.close
catnamefile = open(entrydata+'.txt','a')
catnamefile.close
if os.stat(entrydata+'.txt').st_size == 0:
categoryedit = open(entrydata+'.txt', 'w')
categoryedit.write('0')
print('it worked')
categoryedit.close
print('derp')
self.master.destroy()
def closewindow(self):
self.master.destroy()
は、ボタンとして新しいカテゴリでAddTab更新を除くことになっているすべてを行います。
私がインターネットで検索したことの多くは、メインループが「イベント処理」や更新を行っていると言います。私はこれが何を意味するのか、特に私が見た多くのプログラムが__init__
にすべてのウィジェットを持っているかどうかは分かりません。
私は自分でPythonを学びたいと思っています。これの多くはおそらく悪い(ひどい)プログラミングであり、それはプログラミングへの私の最初の挑戦であり、私は喜んで学びます。
誰かが完全なコードを見たいと思えば、私もそれを投稿することができます。
編集:ここでは
が要求されるように、完全なコードです:それは基本的にAddTabのコピーとなりますよう
import tkinter as tk
import os
filetuple = ('categorynames', 'barcodes')
for filename in filetuple:
fileopen = open(filename+'.txt','a')
fileopen.close
catnameopen = open('categorynames.txt','r').read().splitlines()
print(catnameopen)
for categoryname in catnameopen:
print(categoryname)
categoryamt = open(categoryname+'.txt','a')
categoryamt.close
if os.stat(categoryname+'.txt').st_size == 0:
categoryedit = open(categoryname+'.txt', 'w')
categoryedit.write('0')
print('it worked')
categoryedit.close
print('derp')
else:
print("not needed")
class MainMenu:
def __init__(self, master):
self.master = master
self.master.minsize(width = 800, height = 480)
self.master.maxsize(width = 800, height = 480)
self.master.geometry('800x480+0+0')
self.frame = tk.Frame(self.master)
self.addtabbutton = tk.Button(self.frame, text = 'ADD FOOD', width = 100, command = self.addtabwindow)
self.addtabbutton.pack()
self.subtabbutton = tk.Button(self.frame, text = 'SUBTRACT FOOD', width = 100, command = self.subtabwindow)
self.subtabbutton.pack()
self.quitbutton = tk.Button(self.frame, text = 'QUIT', width = 100, command = self.closewindow)
self.quitbutton.pack()
self.frame.pack()
def closewindow(self):
self.master.destroy()
def addtabwindow(self):
self.addtabwindow = tk.Toplevel(self.master)
self.app = AddTab(self.addtabwindow)
def subtabwindow(self):
self.subtabwindow = tk.Toplevel(self.master)
self.app = SubTab(self.subtabwindow)
class NewCategory:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 400, height = 240)
self.master.maxsize(width = 400, height = 240)
self.master.geometry('400x240+0+0')
self.label = tk.Label(self.frame, text = 'ADD NEW CATEGORY')
self.label.grid(row = 1, column = 1, columnspan = 2)
self.newcatentry = tk.Entry(self.frame, width = 50)
self.newcatentry.grid(row = 2, column = 1, columnspan = 2)
quitbutton = tk.Button(self.frame, text = 'QUIT', width = 25, command = self.closewindow)
quitbutton.grid(row = 3, column = 1)
enterbutton = tk.Button(self.frame, text = 'ENTER', width = 25, command = self.entryget)
enterbutton.grid(row = 3, column = 2)
self.frame.grid(row = 0, column = 0)
def entryget(self):
entrydata = self.newcatentry.get()
catnameopen = open('categorynames.txt','a')
catnameopen.write(entrydata+'\n')
catnameopen.close
catnamefile = open(entrydata+'.txt','a')
catnamefile.close
if os.stat(entrydata+'.txt').st_size == 0:
categoryedit = open(entrydata+'.txt', 'w')
categoryedit.write('0')
print('it worked')
categoryedit.close
print('derp')
self.master.destroy()
def closewindow(self):
self.master.destroy()
class AddTab:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 800, height = 480)
self.master.maxsize(width = 800, height = 480)
self.master.geometry('800x480+0+0')
self.label = tk.Label(self.master, text = 'ADD TO CATEGORY')
self.label.pack(anchor = 'n')
self.frame.pack()
def loopstuff(self):
catnames = open('categorynames.txt','r').read().splitlines()
for name in catnames:
addbutton = tk.Button(self.frame, text = '+1 '+name, width = 20, command = lambda name = name: self.addtocategory(name))
addbutton.pack()
addnewcat = tk.Button(self.frame, text = 'ADD NEW CATEGORY', width = 100, command = self.addnewcategory)
addnewcat.pack(anchor = 's')
def addnewcategory(self):
self.addnewcategory = tk.Toplevel(self.master)
self.app = NewCategory(self.addnewcategory)
def addtocategory(self, name):
print(name)
nameamt = open(name+'.txt','r').read()
nameamt = int(nameamt) + 1
newamt = open(name+'.txt','w')
newamt.write(str(nameamt))
newamt.close
class SubTab:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 800, height = 480)
self.master.maxsize(width = 800, height = 480)
self.master.geometry('800x480+0+0')
self.label = tk.Label(self.master, text = 'SUBTRACT FROM CATEGORY')
self.label.pack()
catnames = open('categorynames.txt','r').read().splitlines()
#for name in catnames:
#self.catnamebutton = tk.Button(self.frame, text = name, width = 30)
#self.catnamebutton.pack()
self.frame.pack()
def main():
root = tk.Tk()
app = MainMenu(root)
root.geometry('800x480+0+0')
root.mainloop()
if __name__ == '__main__':
main()
サブタブは基本的に無視することができます。
投稿したコードに問題があると思われます。 'NewCategory'と' AddTab'はどちらも 'Frames'です(継承を使うべきです... Python 3 C'mon)。あなたの質問のタイトルが書いている問題( "windows"について)は、複数のTk 'Application'を持つことになります。 'NewCategory'を呼び出したり構築したりするあなたのコードはどこですか?おそらくどこかで 'show()'のようなことをするでしょうか? – Tersosauros
@Tersosauros投稿を更新して完全なコードを追加しました。私はPythonProgrammingをこのプロジェクトのための私の主なリソースとして、そしてさまざまなStackoverflowの投稿として使用してきました。私が思っている問題は、基本的に、古いボタンと共に全く新しいセットのボタンを作成せずに、各カテゴリーに対応するボタンを作成する 'forループ'を繰り返す必要があるということです。私は、ウィンドウを閉じて、それを開くと、コードは正常に動作します。ご協力ありがとうございました! –