Python 3 tkinter ウォーター アラームが IF ループで実行されませんでした

kpl33

私はいくつかのミニプロジェクトをプログラミングしてpython guiを学習しようとしています。だから今、私は水警報をプログラムしようとしましたが、問題は、私のプログラムがifループに入らなかったことです. ここに私のコードがあります

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

#Eingabefeld=EF / Button= BN/ Label= LB

import csv
import datetime
import os
import sys
import csv 
import time
import webbrowser
import threading
from tkinter import *
from tkinter import messagebox


path= '\\Users\YIF5WI\water alert\wateralarm'
filename= 'godhelpme.csv'
global fullpath
fullpath= os.path.join(path,filename)

class Waterentry:
    def __init__(self, master):
        self.master = master    

        master.title('Water controller')
        master.configure(bg='light blue')

        ws = master.winfo_screenwidth()         
        hs = master.winfo_screenheight() 
        x = ws - 350
        y = hs - 300
        self.master.geometry('%dx%d+%d+%d' % (350, 300, x, y))

        self.frame = Frame(master)
        self.frame.configure(bg='light blue')
        self.frame.pack()

        self.LB_txt= Label(self.frame,bg='light blue', text='Choose how much you drink or \n Write the amount of water in ml!!!')
        self.LB_txt.pack(side=TOP)

        self.txtDisplay = Entry(self.frame,bd= 20, insertwidth=1, font= 30)
        self.txtDisplay.pack(side= TOP)
        self.txtDisplay.bind("<KeyRelease>", self.checkifdigit)

        self.frame2=Frame(master)
        self.frame2.configure(bg='light blue')
        self.frame2.pack(side = TOP)
        self.BN_txtOk= Button(self.frame2,text ='OK',bg = 'green',fg='white', padx=38, pady= 8, bd= 8, command = lambda : self.txtOk(self.txtDisplay))
        self.BN_txtOk.grid(row=0, column= 0)


        self.LB_info= Label(self.frame2,bg='light blue', text='1 Suppenloffel=10ml/ Ein Schluck  min = 20ml,max=40ml')
        self.LB_info.grid(row=1)

        self.frame3= Frame(master)
        self.frame3.configure(bg='light blue')
        self.frame3.pack(side=TOP)
        self.BN_water= Button(self.frame3, text ='100ml',bg ='blue',fg = 'white',padx=8, pady= 8, bd= 8, command = lambda : self.addNumber('100ml'))
        self.BN_water.pack(side = LEFT)
        self.BN_water1= Button(self.frame3, text ='200ml',bg ='blue',fg = 'white',padx=8, pady= 8, bd= 8, command = lambda : self.addNumber('200ml'))
        self.BN_water1.pack(side = LEFT)        
        self.BN_water2= Button(self.frame3, text ='300ml',bg ='blue',fg = 'white',padx=8, pady= 8, bd= 8, command = lambda : self.addNumber('300ml'))
        self.BN_water2.pack(side = LEFT)        
        self.BN_water3= Button(self.frame3, text ='0,5L',bg ='blue',fg = 'white',padx=8, pady= 8, bd= 8, command = lambda : self.addNumber('500ml'))
        self.BN_water3.pack(side = LEFT)
        self.BN_water4= Button(self.frame3, text ='1L',bg ='blue',fg = 'white',padx=8, pady= 8, bd= 8, command = lambda : self.addNumber('1000ml'))
        self.BN_water4.pack(side = LEFT)

    def checkifdigit(self, EN_number):
        if not self.txtDisplay.get().isdigit():
            txt = self.txtDisplay.get()[:-1]
            self.txtDisplay.delete(0, END)
            self.txtDisplay.insert(0, txt)
        else:
            self.txtDisplay.get()


    def txtOk(self,EN_number):
        EN_number = self.txtDisplay.get()    
        print(EN_number)

        with open(fullpath,'a',) as f:  
            writer = csv.writer(f)     
            ohne_ml=re.sub(r'\D', '',EN_number)  
            writer.writerow(ohne_ml.split(','))                
        return

    def addNumber(self,BN_number):         
        print(BN_number)        
        with open(fullpath,'a') as f:
            writer1=csv.writer(f)
            new= re.sub(r'\D', '',BN_number)
            writer1.writerow(new.split(','))                    
        return  

def entry():
    root1= Tk()
    waterentry= Waterentry(root1)

    root1.mainloop()

ここのメイン関数で問題があります

def opentkformessage():   
    root=Tk()
    root.withdraw()


def checkentry():
    try:
        with open('godhelpme.csv') as input, open('godhelpme1.csv', 'w') as output:
            non_blank = (line for line in input if line.strip())
            output.writelines(non_blank)

        with open("godhelpme1.csv") as fin:
            total = 0
            for row in csv.reader(fin):
                total += int(row[0])
                global total_liter
                total_liter= total * 0.001
        print(total_liter)
    except:
        opentkformessage()
        messagebox.showinfo('Water drink program','You must add your drunked water')
        entry()


def main():

    checkentry()
    opentkformessage()   
    global total_liter

    if (total_liter < 0.5):      
        messagebox.showinfo('WARNING','Drunked water:' +str(total_liter)+' L\nGOOO and take  minumum 0.2Liter WATER!!!\n You have 60 seconds!!')
        entry()  
        #time.sleep(10)
        **# HERE IS MY PROBLEM AFTER I CALL THE ENTRY() FUNCTION 
        # the if total_liter<0.2 will passed**
        checkentry()
        time.sleep(5)
        if (total_liter < 0.2):
            count = 0
            while count <5:
                os.system('water.jpg')
                time.sleep(5)
                webbrowser.open('https://www.youtube.com/watch?v=cRYMOIn45uE')
                time.sleep(15)
                os.system('water.png')
                time.sleep(5)
                os.system('water.jpg')
                time.sleep(5)
                count +=1
            entry()    

        else:
            messagebox.showinfo('INFO','Good you reach 0.5Liter')


    elif(0.501 < total_liter < 1.0):
        messagebox.showinfo('INFO', 'Drunked water:' +str(total_liter)+' L\nTry to drink approximately 0.3 liter\nfor the next hour' )
        entry() 

    elif(1.01 < total_liter < 2.0):
        messagebox.showinfo('INFO', 'Drunked water:' +str(total_liter)+' L\n Try to reach min water level.\n' )
        entry() 

    #elif (2.01 < total_liter):
        #messagebox.showinfo('INFO','Good!\n You reach the minumum water level.\nYou totally drink:'+str(total_liter)+' L')
        #entry()
    elif (2.1 < total_liter ): 
        messagebox.showinfo('INFO','Good!\n You reach the minumum water level.\nYou totally drink:'+str(total_liter)+' L\n Now your saved drunked water will cleaned')
        os.remove('godhelpme.csv')

    else:
        messagebox.showinfo('Something is wrong but, i don t now what:-)')

    #threading.Timer(10.0, main).start()
if __name__ == '__main__':  
    main()

キー割り込みの後、私は得る:

Traceback(most recent call last):
File"finish.py", line 181, in<module>
 main()
File"finish.py", line 138,in main
 entry()
File"finish.py", line 103,in entry
 root1.mainloop()
デリオト

あなたは tkinter メインループを開始しています。メインループは、tkinter に関するすべてを制御する無限ループです。一度入力すると、イベント ループに入り、コードを実行するようにバインドされている入力、またはイベント ループでスケジュールされたコールバックを指定しない限り、それ以降のコードは実行されません。これは、この問題に関する良いリファレンスです。

主なポイントは、あなたが精神的に任意のTkinterのを代用しなければならないということです.mainloop()、それはであるかのようにwhile True: do tkinter_updates物事を実行する最良の方法は、main()関数の大部分を独自の関数として登録することです次に、 を呼び出しroot.after(1000, main)て、メインループの開始後に関数を実行するようにスケジュールできます。


警告: コードが複数のメインループを開始する可能性があります。これは、スコープが適切に設定れておらず (1 つのメインループがその親メインループのデータを認識できないため)、無数のバグやメモリリークの原因となるため (新しいメインループに割り当てているため、古いものはまだアクセス可能です;あなたは再帰を使用しています)。コードが複数のメインループを開始できないことを確認してください。そうしない、問題が発生します。

また、time.sleep()tkinterでは絶対に使用ないでくださいPython がスリープしている間、tkinter は入力を更新または受信できません。root.after()将来起こることをスケジュールするために使用します。これは、ほぼ一貫性がありtime.sleep()、GUI 全体をフリーズせず、tkinter で一般的により適切に動作します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

pyenvでPython3をインストールした後、tkinterをインポートできません

分類Dev

カスタムPython3アプリケーションでqgisを実装するときに、「」にQtプラットフォームプラグイン「Windows」が見つかりませんでしたか?

分類Dev

ループはPythonプログラムで実行されません

分類Dev

ユーザー入力でのPython3Tkinter名エラー(定義されていません)

分類Dev

print()関数は、Python3でforループが終了した後にのみ実行されます

分類Dev

Python tkinterは、forループで作成された個々のボタンパラメーターを変更します

分類Dev

Raspberry Pi ブートで実行される Python/Tkinter アプリ

分類Dev

CythonでラップされたPythonコードを実行できません

分類Dev

Pythonでforループを実行する:最初は正しく実行されますが、残りの実行は正しく実行されません

分類Dev

Pythonシェルはエラーを表示しませんが、プログラムは実行されません

分類Dev

Pythonはターミナルで実行されません

分類Dev

Pythonプログラムは、フォルダーまたはデスクトップから開くと正しく実行されませんが、IDLEで実行すると正常に動作します

分類Dev

「Pythonスクリプトの実行」モジュールのAzureML:共通テーブル式はsqlite3ではサポートされていません

分類Dev

3Dでアニメーション化されたランダムウォーク[Python]

分類Dev

(Ubuntu)Python3スクリプトは正常に実行されますが、Apache / wsgiではseleniumモジュールが見つかりません

分類Dev

NameError:名前 'スレッド'が定義されていませんターミナルでPythonプログラムを実行します

分類Dev

anaconda3 python3.5を使用したTensorflowのインストールで「読み取りタイムアウトエラー」が発生しました

分類Dev

TkinterアプリはWindowsで実行されますが、ラズベリーパイでウィンドウを開きません

分類Dev

TimeoutException:メッセージ:タイムアウトとウェブページがPython3を介してChromeDriverChromeで読み込まれ/応答しません

分類Dev

「フォーム」を実行しようとしましたが、2ページ目で空白のページが表示され、3ページ目にデータが渡されませんでした。

分類Dev

Python 3&Tkinterバギーで遅い

分類Dev

Pythonスクリプトは、Windows 2008R2でスケジュールされたタスクとして実行されません

分類Dev

別のウィジェットpython 3 tkinterでプレイスを使用すると、ウィジェットがフレームとして認識される

分類Dev

Docker内のインタープリターでPythonスクリプトを実行できません[Errno 13]許可が拒否されました

分類Dev

親ウィンドウ(python、Tkinter)を破棄した後、無限ループでスタックしました

分類Dev

タートルPython3ファイルを実行できません

分類Dev

Tkinter Python:関数で呼び出されたときにモジュールが見つかりませんか?

分類Dev

Pythonスクリプトを実行できませんプログラムエラー:/ usr / bin / python3 ^ M:不正なインタープリター:

分類Dev

Mavenコマンドmvnはターミナルからエラーなしで実行されますが、Pythonからは実行されません

Related 関連記事

  1. 1

    pyenvでPython3をインストールした後、tkinterをインポートできません

  2. 2

    カスタムPython3アプリケーションでqgisを実装するときに、「」にQtプラットフォームプラグイン「Windows」が見つかりませんでしたか?

  3. 3

    ループはPythonプログラムで実行されません

  4. 4

    ユーザー入力でのPython3Tkinter名エラー(定義されていません)

  5. 5

    print()関数は、Python3でforループが終了した後にのみ実行されます

  6. 6

    Python tkinterは、forループで作成された個々のボタンパラメーターを変更します

  7. 7

    Raspberry Pi ブートで実行される Python/Tkinter アプリ

  8. 8

    CythonでラップされたPythonコードを実行できません

  9. 9

    Pythonでforループを実行する:最初は正しく実行されますが、残りの実行は正しく実行されません

  10. 10

    Pythonシェルはエラーを表示しませんが、プログラムは実行されません

  11. 11

    Pythonはターミナルで実行されません

  12. 12

    Pythonプログラムは、フォルダーまたはデスクトップから開くと正しく実行されませんが、IDLEで実行すると正常に動作します

  13. 13

    「Pythonスクリプトの実行」モジュールのAzureML:共通テーブル式はsqlite3ではサポートされていません

  14. 14

    3Dでアニメーション化されたランダムウォーク[Python]

  15. 15

    (Ubuntu)Python3スクリプトは正常に実行されますが、Apache / wsgiではseleniumモジュールが見つかりません

  16. 16

    NameError:名前 'スレッド'が定義されていませんターミナルでPythonプログラムを実行します

  17. 17

    anaconda3 python3.5を使用したTensorflowのインストールで「読み取りタイムアウトエラー」が発生しました

  18. 18

    TkinterアプリはWindowsで実行されますが、ラズベリーパイでウィンドウを開きません

  19. 19

    TimeoutException:メッセージ:タイムアウトとウェブページがPython3を介してChromeDriverChromeで読み込まれ/応答しません

  20. 20

    「フォーム」を実行しようとしましたが、2ページ目で空白のページが表示され、3ページ目にデータが渡されませんでした。

  21. 21

    Python 3&Tkinterバギーで遅い

  22. 22

    Pythonスクリプトは、Windows 2008R2でスケジュールされたタスクとして実行されません

  23. 23

    別のウィジェットpython 3 tkinterでプレイスを使用すると、ウィジェットがフレームとして認識される

  24. 24

    Docker内のインタープリターでPythonスクリプトを実行できません[Errno 13]許可が拒否されました

  25. 25

    親ウィンドウ(python、Tkinter)を破棄した後、無限ループでスタックしました

  26. 26

    タートルPython3ファイルを実行できません

  27. 27

    Tkinter Python:関数で呼び出されたときにモジュールが見つかりませんか?

  28. 28

    Pythonスクリプトを実行できませんプログラムエラー:/ usr / bin / python3 ^ M:不正なインタープリター:

  29. 29

    Mavenコマンドmvnはターミナルからエラーなしで実行されますが、Pythonからは実行されません

ホットタグ

アーカイブ