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

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

ただいまの
回答率

89.22%

Tkinterの表示内容を変更する方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 60

nb_spaceball

score 2

前提・実現したいこと

PythonのTkinterモジュールを使ってXMLから読み取った内容を表示するウィンドウを作っています。
"Add"ボタンを押してファイルダイアログから選択してxmlに選択内容を追記した時や
リスト内の項目を選択状態で"Remove"ボタンを押しxmlから選択内容を削除した時、
xmlの内容が変更したことに合わせてリスト内の表示を更新させたいです。

conf.xmlには別のファイルから参照する内容も含まれていますが、
そのまま載せています。

表示内容の変更方法を教えてください。

該当のソースコード

# coding: utf-8

import os
import sys
import tkinter as tk
import xml.etree.ElementTree as et
import tkinter.filedialog as filedialog
from tkinter import StringVar

tree = et.parse('conf.xml')
root = tree.getroot()


def xml():
    tree = et.parse('conf.xml')
    root = tree.getroot()
    remlist =[]
    for child in root:
        if child.attrib["name"] == "remlist":
            remlist.append(child.find("dir").text)
    return remlist

remlist = xml()


#除外リストの追加
def ubab_button_clicked():
    #スクリプト自身のファイルパスのディレクトリの取得
    initdir = os.path.dirname(__file__)
    #初期ディレクトリとして自身の親ディレクトリを指定する
    file  = filedialog.askdirectory(initialdir=initdir)
    root_rem = et.Element('data')
    remxml = et.SubElement(root, 'remlist')
    remxml_id = remxml.set('name','remlist')
    remxml_id = et.SubElement(remxml, 'dir')
    remxml_id.text = file

    tree.write('conf.xml', encoding='utf-8', xml_declaration=True)

#リスト内の選択された項目をXMLファイルから削除する
def ubrb_button_selected(remlistbox):
    if len(remlistbox.curselection()) == 0:
        return
    index = remlistbox.curselection()[0]
    index = remlistbox.get(index)
    # XMLを解析
    tree = et.parse('conf.xml')
    # XMLを取得
    root = tree.getroot()
    # dir内の要素が選んだものと同じになるまでループを回してremoveですべて削除
    for remlist in root.findall('remlist'):
        for remdir in remlist.findall('dir'):
            if remdir.text == index:
                remlist.remove(remdir)
                root.remove(remlist)
                tree.write('conf.xml')

                # アクティブなリストの番号を取得しリストから削除する
                selIndex = tk.ACTIVE
                remlistbox.delete(selIndex)

def action_b():
    bu_nas.exection()

class Frame(tk.Frame):
    def __init__ (self, master=None):
        tk.Frame.__init__(self, master)
        self.master.title("Buck Up Menu")


        ubul = tk.Label(self, text='Un Buck Up Folder List')
        ubul.grid(row=1, column=0, padx=5, pady=5, sticky=tk.W)


        farb = tk.Frame(self)
        farb.grid(row=1, column=2, padx=5, pady=5,sticky=tk.E)

        ubab = tk.Button(farb, text='Add', relief=tk.RIDGE, bd=2,command=ubab_button_clicked)
        ubab.grid(row=0, column=1, padx=2, sticky=tk.W)

        ubrb = tk.Button(farb, text='Remove', relief=tk.RIDGE, bd=2, command=lambda: ubrb_button_selected(remlistbox))
        ubrb.grid(row=0, column=2, padx=2, sticky=tk.E)

        remframe = tk.Frame(self)
        remframe.grid(row=2, column=0, padx=5, pady=5)

        cnames = StringVar(value=remlist)
        remlistbox = tk.Listbox(remframe, listvariable=cnames, height=5)
        remlistbox.pack()

        ac = tk.Button(self, text='Action', command=action_b)
        ac.grid(row=3, column=1, padx=5, pady=5, sticky=tk.E)

        qb = tk.Button(self, text='Quit', command=self.quit_b)
        qb.grid(row=3, column=2, padx=5, pady=5, sticky=tk.E)

    def quit_b(self):
        self.master.destroy()


def act():
    if __name__ == '__main__':
        f = Frame()
        f.pack()

act()
<?xml version='1.0' encoding='utf-8'?>
<data>
    <inputpath name="Input Path">
        <dir>og_tests</dir>
    </inputpath>

    <outputpath name="Output Path">
        <dir>ex_tests</dir>
    </outputpath>

    <pause name="Pause">
        <onoff>on</onoff>
    </pause>

    <remlist name="remlist"><dir>01</dir></remlist>
    <remlist name="remlist"><dir>02</dir></remlist>
    <remlist name="remlist"><dir>03</dir></remlist>
</data>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • teamikl

    2020/05/23 16:46

    コードが実行できません。
    動作確認に必要な、最小限の 「conf.xml の内容」と

    > ウィンドウの表示内容が変更されません。
    の「再現手順」と、「期待する動作」の情報を質問文に追記お願いします。

    また、import bu_nas は何かわかりませんが、
    無視しても大丈夫でしょうか?
    (明らかに関係なさそうですが、影響が及ぶ事も有り得るので確認)

    キャンセル

  • nb_spaceball

    2020/05/23 20:10

    ご意見を参考に内容を変更・追記しました。(import bu_nasは関係ないので削除しました)
    質問に慣れておらず基本的なことが漏れておりました、ご指摘ありがとうございます。

    キャンセル

回答 1

checkベストアンサー

0

f.mainloop() 追加にて、起動を確認。


"Remove" で要素の削除は確認できました。
↑ここは正常な動作ですか?

"Add" では「ディレクトリ選択」ダイアログがでてきて、
選択されたディレクトリのpath がxmlファイルに追加されてます。
↑このファイルへの保存部分は意図通りの動作ですか?

Addで何を選べばよいのかわかりませんでしたが、
xmlファイルの変更した内容を、プログラムを再起動することなく、
リストへ反映させたいということですよね。

Removeのときと同じ様に対応するなら、

  • ubab_button_clicked に remlistbox を渡す(Removeを参考に)
  • 追加した要素を remlistbox.insert で追加

他には、若干冗長になりますが、(XMLファイルが小規模なら)
一旦リストの要素をクリアして、起動時の処理をもう一度呼ぶと言う手段もあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/23 21:41

    f.mainloop()を追加し確認してみました。
    "Remove"は意図したよう正常に動作しました。
    "Add"のxml追記はおっしゃる動作で問題ありません。
    記載の通り引数を渡してremlistbox.insert("end",file)で意図した動作になりました。

    ご丁寧にご回答いただきありがとうございました。勉強になりました。

    キャンセル

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

  • ただいまの回答率 89.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる