質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

PyCharm

エディター・開発ツール

解決済

Python tkinter Date型のEntryにあるNoneが今日の日付に変換される

yoshiyoshi
yoshiyoshi

総合スコア3

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

PyCharm

エディター・開発ツール

3回答

0評価

0クリップ

233閲覧

投稿2022/08/16 00:57

前提

PythonでDBにある納期設定日を変更するプログラムを作成しています
日付が入力されていないデータ(None)が一部にあり、DBに上書きする際に
Entryからデータを取得しようとするとなぜか今日の日付が勝手に入力されます
どのようにすればNoneのまま取得できるのかご教示いただけないでしょうか

実現したいこと

日付がNoneの時はNoneのまま処理を行いたい

発生している問題・エラーメッセージ

Entryの値がNoneとなっていても
dl1 = entry31.get_date()
(もしくは dl1 = entry31.get() としても)
とすると dl1に今日の日付が入ってしまいます

if で Noneの時だけ何か処理を変えればよいのかと思い
if entry31 is None:
entry31.delete()
else:
dl1 = entry31.get_date()
としても Noneと判定されずに elseに流れ今日の日付が入力されます

該当のソースコード

Python 入りきらなかったので一部略

def open_tree(): global tree global Name global dst global ded global open_form_window sql = f"SELECT [Id],[Co_Name],FORMAT([希望納期],'yyyy/MM/dd'),FORMAT([目標納期],'yyyy/MM/dd'),FORMAT([回答納期],'yyyy/MM/dd'),FORMAT([出荷予定日],'yyyy/MM/dd') FROM [Test].[dbo].[Tr_Slip_table]; " print(sql) open_form_window = tk.Toplevel() open_form_window.title('納期一覧') open_form_window.configure(bg='khaki') open_form_window.overrideredirect(True) root_x, root_y = root.winfo_x(), root.winfo_y() open_form_window.geometry(f'450x240+{root_x - 0}+{root_y - 240}') print(root.__dict__) form = ttk.Frame(open_form_window) new_frame1 = tk.Frame(open_form_window, bg='khaki', pady=2) new_frame1.pack(fill='both', expand=True) form.pack() open_form_window.attributes("-topmost", True) tree = ttk.Treeview(open_form_window) tree["columns"] = (1, 2, 3, 4, 5, 6) tree["show"] = "headings" tree["displaycolumns"] = [1, 2, 3, 4, 5, 6] tree.column(1, width=40, anchor=tk.CENTER) tree.column(2, width=50, anchor=tk.E) tree.column(3, width=50, anchor=tk.E) tree.column(4, width=50, anchor=tk.CENTER) tree.column(5, width=50, anchor=tk.E) tree.column(6, width=50, anchor=tk.E) tree.heading(1, text="製番") tree.heading(2, text="得意先名") tree.heading(3, text="希望納期") tree.heading(4, text="目標納期") tree.heading(5, text="回答納期") tree.heading(6, text="出荷予定") tree.pack(padx=(5,5), pady=(5,5), fill='both', expand=True) for item in tree.get_children(): tree.delete(item) for row in cursor.execute(sql): row = list(row) tree.insert("", "end", values=row) tree.bind('<Double-1>', getVule) def getVule(event): selected_items = tree.selection() if not selected_items: return values = tree.item(selected_items[0], 'values') with open('log.txt', 'a') as f: print(values, file=f) global open_form_window2 global nouki1 global nouki2 global nouki3 global nouki4 global label12 global entry31 global entry32 global entry33 global entry34 if open_form_window2: open_form_window2.destroy() open_form_window2 = tk.Toplevel() open_form_window2.title('納期変更') open_form_window2.configure(bg='khaki') open_form_window2.overrideredirect(True) root_x, root_y = root.winfo_x(), root.winfo_y() open_form_window2.geometry(f'450x80+{root_x - 0}+{root_y - 325}') print(root.__dict__) form = ttk.Frame(open_form_window2) new_frame2 = tk.Frame(open_form_window2, bg='khaki', pady=2) label11 = tk.Label(new_frame2, text="製番", font=("", 9), fg='black', bg="antique white", height=1, width=8) label12 = tk.Label(new_frame2, text=values[0], font=("", 10), fg='black', bg="antique white", height=1, width=8) label13 = tk.Label(new_frame2, text="得意先名", font=("", 9), fg='black', bg="antique white", height=1, width=10) label14 = tk.Label(new_frame2, text=values[1], font=("", 10), fg='black', bg="antique white", height=1, width=20) button2 = tk.Button(new_frame2, text="上書き", font=("", 10), width=8, bg="#e6e6fa", command=update_nouki) label11.pack(side=tk.LEFT, padx=2) label12.pack(side=tk.LEFT, padx=2) label13.pack(side=tk.LEFT, padx=2) label14.pack(side=tk.LEFT, padx=2) button2.pack(side=tk.RIGHT, expand=None, padx=5) new_frame2.pack(fill='both', expand=None) new_frame3 = tk.Frame(open_form_window2, bg='khaki', pady=5) label21 = tk.Label(new_frame3, text="希望納期", font=("", 9), fg='black', bg="antique white", height=1, width=11) label22 = tk.Label(new_frame3, text="目標納期", font=("", 9), fg='black', bg="antique white", height=1, width=11) label23 = tk.Label(new_frame3, text="回答納期", font=("", 9), fg='black', bg="antique white", height=1, width=11) label24 = tk.Label(new_frame3, text="出荷予定", font=("", 9), fg='black', bg="antique white", height=1, width=11) button3 = tk.Button(new_frame3, text="希望", font=("", 9), width=9, bg="#e6e6fa", command=update_dl1) label21.pack(side=tk.LEFT, padx=15) label22.pack(side=tk.LEFT, padx=7) label23.pack(side=tk.LEFT, padx=7) label24.pack(side=tk.LEFT, padx=7) button3.pack(side=tk.RIGHT, expand=None, padx=5) new_frame3.pack(fill='both', expand=None) style = ttk.Style() style.theme_use('clam') style.configure('my.DateEntry', fieldbackground='light green', background='dark green', foreground='black', arrowcolor='white') root.data_entry_date = DateEntry(style='my.DateEntry', showweeknumbers=False) root.data_entry_date.place(x=250, y=230) root.calender_date = DateEntry(showweeknumbers=False) root.calender_date.place(x=500, y=230) root.calender_date.pack() new_frame4 = tk.Frame(open_form_window2, bg='khaki', pady=0) entry31 = DateEntry(new_frame4, style='my.DateEntry', showweeknumbers=False, locale='ja_JP.UTF-8', width=11) entry32 = DateEntry(new_frame4, style='my.DateEntry', showweeknumbers=False, locale='ja_JP.UTF-8', width=11) entry33 = DateEntry(new_frame4, style='my.DateEntry', showweeknumbers=False, locale='ja_JP.UTF-8', width=11) entry34 = DateEntry(new_frame4, style='my.DateEntry', showweeknumbers=False, locale='ja_JP.UTF-8', width=11) entry31.pack(side=tk.LEFT, padx=15) entry32.pack(side=tk.LEFT, padx=5) entry33.pack(side=tk.LEFT, padx=5) entry34.pack(side=tk.LEFT, padx=5) new_frame4.pack(fill='both', expand=None) form.pack() open_form_window2.attributes("-topmost", True) entry31.delete(0, "end") entry32.delete(0, "end") entry33.delete(0, "end") entry34.delete(0, "end") if uwagaki == 0: entry31.insert(0, values[2]) entry32.insert(0, values[3]) entry33.insert(0, values[4]) entry34.insert(0, values[5]) else: entry31.insert(0, nouki1) entry32.insert(0, nouki2) entry33.insert(0, nouki3) entry34.insert(0, nouki4) def update_nouki(): global nouki1 global nouki2 global nouki3 global nouki4 global uwagaki print(entry31.get_date()) idno = label12.cget("text") if entry31 is None: entry31.delete() else: dl1 = entry31.get_date() dl2 = entry32.get_date() dl3 = entry33.get() dl4 = entry34.get_date() sql = f"UPDATE [Test].[dbo].[Tr_Slip_table] SET [希望納期] = '{dl1}',[目標納期] = '{dl2}',[回答納期] = '{dl3}',[出荷予定日] = '{dl4}' WHERE [Id]={idno};" res = tkinter.messagebox.askyesnocancel(title="上書き確認", message="表示の内容で更新します。納期情報を残しておきますか?") print(res) if res == True: cursor.execute(sql) cursor.commit() nouki1 = entry31.get_date() nouki2 = entry32.get_date() nouki3 = entry33.get_date() nouki4 = entry34.get_date() uwagaki = 1 print(nouki1) print(type(nouki1)) open_tree() elif res == False: print(sql) cursor.execute(sql) cursor.commit() nouki1 = "" nouki2 = "" nouki3 = "" nouki4 = "" uwagaki = 0 open_tree() else: tkinter.messagebox.showinfo(title="取り消し", message="処理を取り消しました") def update_dl1(): global entry31 global entry32 global entry34 start_date = entry31.get_date() if is_holiday_or_weekend(start_date) == True: res = tkinter.messagebox.askokcancel(title="タイトル", message="休日です処理を中止します") if res == True: return else: print(res) else: print(start_date) start_date = start_date + datetime.timedelta(days=-1) while is_holiday_or_weekend(start_date) == True: start_date = start_date + datetime.timedelta(days=-1) entry32.delete(0, "end") entry32.insert(0, start_date) entry34.delete(0, "end") entry34.insert(0, start_date) print(start_date) def is_holiday_or_weekend(date): return date.weekday() == 6 or date.weekday() == 5 or jpholiday.is_holiday(date) def close_tree(): global open_form_window if open_form_window: open_form_window.destroy() open_form_window = None open_form_window2 = None root = tk.Tk() root.title("納期変更アプリ") root.geometry("450x40") root.geometry('+1300+900') root.configure(bg='khaki1') root.overrideredirect(True) frame1 = tk.Frame(root, pady=5, padx=5, relief=tk.RAISED, bd=2, bg='khaki') label1 = tk.Label(frame1, text="納期変更アプリ", font=("", 10), fg='black', bg="antique white", height=1, width=12) button1 = tk.Button(frame1, text="読込", font=("", 10), width=8, bg="#e6e6fa", command=open_tree) button3 = tk.Button(frame1, text="×", font=("", 8, "bold"), width=1, fg='white', bg='red', command=root.destroy) label1.pack(side=tk.LEFT) button1.pack(side=tk.LEFT, expand=True) button3.pack(side=tk.RIGHT) frame1.pack(fill=tk.BOTH, expand=True) nouki1 = "" nouki2 = "" nouki3 = "" nouki4 = "" uwagaki = 0 if login(): root.attributes("-topmost", True) else: root.title("納期変更アプリ(接続エラー)") button1['state'] = 'disabled' button2['state'] = 'disabled' root.mainloop()

試したこと

dl1 = entry31.get_date() で日付でとるのがダメなのかと思い
dl1 = entry31.get() でも同じ結果
Noneでなく空白で試しても同じく今日の日付が代入される
Noneを検出してNoneの時だけ処理を変えることを検討したが、そもそもNoneを検出できない

補足情報(FW/ツールのバージョンなど)

Python 3.10.0
PyCharm 2021.3.2 (Community Edition)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

yoshiyoshi

2022/08/16 06:16

できる範囲で不要なところを削ってみました もう一度ご確認いただけないでしょうか SQLSERVERよりSQLにて情報を取り出しております import tkinter as tk from tkinter import ttk from tkcalendar import DateEntry import pyodbc import datetime, jpholiday import tkinter.filedialog DRIVER = '{SQL Server}' SQL_SERVER = 'SV03' PORT = 3306 DB_NAME = 'Test' TABLE_NAME = '[Test].[dbo].[Tr_Slip_table]' USER = '' PASSWORD = '' TRUSTED_CONNECTION = 'yes' def login(): global cursor cmd = f'DRIVER={DRIVER};SERVER={SQL_SERVER};DATABASE={DB_NAME};PORT={PORT};' print("cmd") if USER: cmd += f'USER={USER};' if PASSWORD: cmd += f'PASSWORD={PASSWORD};' if TRUSTED_CONNECTION: cmd += f'Trusted_Connection={TRUSTED_CONNECTION};' try: connect = pyodbc.connect(cmd, charset='utf8') except pyodbc.Error: return False cursor = connect.cursor() return True def open_tree(): global tree global Name global dst global ded global open_form_window sql = f"SELECT [Id],FORMAT([希望納期],'yyyy/MM/dd') FROM [Test].[dbo].[Tr_Slip_table]; " open_form_window = tk.Toplevel() open_form_window.title('納期一覧') open_form_window.configure(bg='khaki') open_form_window.overrideredirect(True) root_x, root_y = root.winfo_x(), root.winfo_y() open_form_window.geometry(f'450x240+{root_x - 0}+{root_y - 240}') print(root.__dict__) form = ttk.Frame(open_form_window) new_frame1 = tk.Frame(open_form_window, bg='khaki', pady=2) new_frame1.pack(fill='both', expand=True) form.pack() open_form_window.attributes("-topmost", True) tree = ttk.Treeview(open_form_window) tree["columns"] = (1, 2) tree["show"] = "headings" tree["displaycolumns"] = [1, 2] tree.column(1, width=40, anchor=tk.CENTER) tree.column(2, width=50, anchor=tk.E) tree.heading(1, text="製番") tree.heading(2, text="希望納期") tree.pack(padx=(5,5), pady=(5,5), fill='both', expand=True) # TreeViewのデータをクリア for item in tree.get_children(): tree.delete(item) for row in cursor.execute(sql): row = list(row) tree.insert("", "end", values=row) tree.bind('<Double-1>', getVule) def getVule(event): selected_items = tree.selection() if not selected_items: return values = tree.item(selected_items[0], 'values') with open('log.txt', 'a') as f: print(values, file=f) global open_form_window2 global nouki1 global label12 global entry31 if open_form_window2: open_form_window2.destroy() open_form_window2 = tk.Toplevel() open_form_window2.title('納期変更') open_form_window2.configure(bg='khaki') open_form_window2.overrideredirect(True) root_x, root_y = root.winfo_x(), root.winfo_y() open_form_window2.geometry(f'450x80+{root_x - 0}+{root_y - 325}') print(root.__dict__) form = ttk.Frame(open_form_window2) new_frame2 = tk.Frame(open_form_window2, bg='khaki', pady=2) label11 = tk.Label(new_frame2, text="製番", font=("", 9), fg='black', bg="antique white", height=1, width=8) label12 = tk.Label(new_frame2, text=values[0], font=("", 10), fg='black', bg="antique white", height=1, width=8) button2 = tk.Button(new_frame2, text="上書き", font=("", 10), width=8, bg="#e6e6fa", command=update_nouki) label11.pack(side=tk.LEFT, padx=2) label12.pack(side=tk.LEFT, padx=2) button2.pack(side=tk.RIGHT, expand=None, padx=5) new_frame2.pack(fill='both', expand=None) new_frame3 = tk.Frame(open_form_window2, bg='khaki', pady=5) label21 = tk.Label(new_frame3, text="希望納期", font=("", 9), fg='black', bg="antique white", height=1, width=11) label21.pack(side=tk.LEFT, padx=15) new_frame3.pack(fill='both', expand=None) # カレンダーのスタイル style = ttk.Style() style.theme_use('clam') style.configure('my.DateEntry', fieldbackground='light green', background='dark green', foreground='black', arrowcolor='white') root.data_entry_date = DateEntry(style='my.DateEntry', showweeknumbers=False) root.data_entry_date.place(x=250, y=230) root.calender_date = DateEntry(showweeknumbers=False) root.calender_date.place(x=500, y=230) root.calender_date.pack() new_frame4 = tk.Frame(open_form_window2, bg='khaki', pady=0) entry31 = DateEntry(new_frame4, style='my.DateEntry', showweeknumbers=False, locale='ja_JP.UTF-8', width=11) entry31.pack(side=tk.LEFT, padx=15) new_frame4.pack(fill='both', expand=None) form.pack() open_form_window2.attributes("-topmost", True) entry31.delete(0, "end") if uwagaki == 0: entry31.insert(0, values[1]) else: entry31.insert(0, nouki1) def update_nouki(): global nouki1 global uwagaki idno = label12.cget("text") if entry31 is None: entry31.delete() else: dl1 = entry31.get_date() sql = f"UPDATE [Test].[dbo].[Tr_Slip_table] SET [希望納期] = '{dl1}' WHERE [Id]={idno};" res = tkinter.messagebox.askyesnocancel(title="上書き確認", message="表示の内容で更新します。納期情報を残しておきますか?") print(res) if res == True: cursor.execute(sql) cursor.commit() nouki1 = entry31.get_date() uwagaki = 1 open_tree() elif res == False: cursor.execute(sql) cursor.commit() nouki1 = "" uwagaki = 0 open_tree() else: tkinter.messagebox.showinfo(title="取り消し", message="処理を取り消しました") def is_holiday_or_weekend(date): return date.weekday() == 6 or date.weekday() == 5 or jpholiday.is_holiday(date) def close_tree(): global open_form_window if open_form_window: open_form_window.destroy() open_form_window = None open_form_window2 = None root = tk.Tk() root.title("納期変更アプリ") root.geometry("450x40") root.geometry('+1300+900') root.configure(bg='khaki1') root.overrideredirect(True) frame1 = tk.Frame(root, pady=5, padx=5, relief=tk.RAISED, bd=2, bg='khaki') label1 = tk.Label(frame1, text="納期変更アプリ", font=("", 10), fg='black', bg="antique white", height=1, width=12) button1 = tk.Button(frame1, text="読込", font=("", 10), width=8, bg="#e6e6fa", command=open_tree) button3 = tk.Button(frame1, text="×", font=("", 8, "bold"), width=1, fg='white', bg='red', command=root.destroy) label1.pack(side=tk.LEFT) button1.pack(side=tk.LEFT, expand=True) button3.pack(side=tk.RIGHT) frame1.pack(fill=tk.BOTH, expand=True) nouki1 = "" uwagaki = 0 if login(): root.attributes("-topmost", True) else: root.title("納期変更アプリ(接続エラー)") button1['state'] = 'disabled' button2['state'] = 'disabled' root.mainloop()

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

PyCharm

エディター・開発ツール