

こんなエラーが出ます。

[code]

    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\81902\anaconda3\lib\tkinter\__init__.py", line 1892, in __call__
        return self.func(*args)
      File "C:\Users\81902\AppData\Local\Temp/ipykernel_5336/2499828448.py", line 35, in sub_window
        read_base = config["Fixed Phrase"]
      File "C:\Users\81902\anaconda3\lib\configparser.py", line 963, in __getitem__
        raise KeyError(key)
    KeyError: 'Fixed Phrase'
    
[/code]

以下がコードです。

[code]

    # インポート
    import tkinter as tk
    from tkinter import ttk
    import configparser
    
    # 設定ファイル用のインスタンス
    config = configparser.ConfigParser()
    # 読み込むiniファイルを指定
    config.read("settings.ini")
    
    ### 関数 ###
    def sub_window():
        # サブウインドウの作成
        fp_window = tk.Toplevel(root)
        # ラベルフレーム1
        frame1= ttk.Labelframe(fp_window, text = "Registration",
                               padding = 10)
        frame1.pack(padx = 20, pady = 10)
        # ラベル
        reg_label = tk.Label(frame1, text = "Fixed Phrase: ")
        reg_label.pack(side = tk.LEFT, anchor = tk.W)
        # 定型文入力欄
        reg_box = tk.Entry(frame1, width = 50)
        reg_box.pack(side = tk.LEFT)
        # 保存ボタン
        save_button = tk.Button(frame1, text ="Save")
        save_button.pack(padx = 10, side = tk.LEFT)
        # ラベルフレーム2
        frame2 = ttk.Labelframe(fp_window, text = "Save Slot",
                                paddin = 10)
        frame2.pack(padx = 20, pady = 5, fill = tk.X)
        # ラジオボタン
        radio_value = tk.IntVar()
        read_base = config["Fixed Phrase"]
        rdio_1 = ttk.Radiobutton(frame2, text =
                                 read_base.get("phrase1"),
                                 variable = radio_value, value = 1) 
        rdio_1.grid(row = 0, column = 0, sticky = tk.W)
        rdio_2 = ttk.Radiobutton(frame2, text =
                                 read_base.get("phrase2"),
                                 variable = radio_value, value = 2) 
        rdio_2.grid(row = 1, column = 0, sticky = tk.W)
        rdio_3 = ttk.Radiobutton(frame2, text =
                                 read_base.get("phrase3"),
                                 variable = radio_value, value = 3) 
        rdio_3.grid(row = 2, column = 0, sticky = tk.W)
        rdio_4 = ttk.Radiobutton(frame2, text =
                                 read_base.get("phrase4"),
                                 variable = radio_value, value = 4) 
        rdio_4.grid(row = 3, column = 0, sticky = tk.W)
        rdio_5 = ttk.Radiobutton(frame2, text =
                                 read_base.get("phrase5"),
                                 variable = radio_value, value = 5) 
        rdio_5.grid(row = 4, column = 0, sticky = tk.W)
        # Setボタン
        set_button = tk.Button(fp_window, text = "Set")
        set_button.pack(padx = 20, pady = 10, ipady = 5, fill = tk.X)
        
    ### GUI ###
    # ウインドウの作成
    root = tk.Tk()
    # フレーム
    frame = ttk.Frame(root, padding = 5)
    frame.pack(padx = 5, pady = 5)
    # テキストボックス
    txtbox = tk.Text(frame, width = 60, height = 20)
    # スクロールバー作成
    yscroll = tk.Scrollbar(frame, orient = tk.VERTICAL,
                           command = txtbox.yview)
    yscroll.pack(side = tk.RIGHT, fill = tk.Y)
    txtbox["yscrollcommand"] = yscroll.set
    # テキストボックスの配置
    txtbox.pack()
    # メニューバーの作成
    menubar = tk.Menu(root)
    root.configure(menu = menubar)
    # Fileメニュー
    filemenu = tk.Menu(menubar, tearoff = 0)
    menubar.add_cascade(label = "File", menu = filemenu)
    # Fileメニューの内容
    filemenu.add_command(label = "Open...")
    filemenu.add_command(label = "Save as...")
    filemenu.add_separator()
    filemenu.add_command(label = "Exit",
                         command = lambda: root.destroy())
    # Helpメニュー
    helpmenu = tk.Menu(menubar, tearoff = 0)
    menubar.add_cascade(label = "Help", menu = helpmenu)
    # >Manual
    helpmenu.add_command(label = "Manual")
    # 定型文ボタン
    fp_button = tk.Button(root, text = "Fixed Phrase",
                          command = sub_window)
    fp_button.pack(padx = 10, pady = 10, ipady = 5, fill = tk.X)
    # ウインドウ状態の維持
    root.mainloop()
    
[/code]


CC BY-SA 4.0
2022-02-04T01:36:30.497
86134
2023-03-03T14:01:15.180
2022-02-04T01:38:33.400
3060
51045
question
python tkinter
コードはあっていると思うのですが、KeyErrorになります。作業ディレクトリのsettings.iniが問題なのでしょうか？


configparserの`KeyError:`はiniファイルの **パス** が存在しない場合と **キー** が存在しない場合の両者で発生します。

下記のコードを実行してみてください。

[code]

    import os
    setting_path = os.getcwd() + os.sep + "settings.ini"
    if not os.path.exists(setting_path):
        print(setting_path, "なんてないです")
    
[/code]

もし実行時に`"C:\Users\XXXXX\AppData\Local\Temp\ipykernel_5336\settings.ini
なんてないです`のようなメッセージが表示される場合は、カレントディレクトリにsettings.iniが配置できていないようです。

Jupyter Notebookを使っていて、カレントディレクトリも設定したはずでしたら[Jupyter
Notebookの初期ディレクトリを変更する](https://qiita.com/mitama/items/a8129e50afcc462e02d6#users%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E7%AD%89%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9)や[Jupyter
Notebookの初期ディレクトリを変更できなかったときの対処法](https://qiita.com/skytomo221/items/8f07734a63a3e7c15860)ができているかを確認してください。

先ほどのコード実行時に何も出力されない場合は、ファイルの読み込みはできています。  
iniファイルの`[Fixed Phrase]`に誤字がないかを確認してください。


CC BY-SA 4.0
2022-02-04T04:40:55.060
86138
2022-02-04T04:40:55.060
9820
86134
answer