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

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

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

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

Tkinter

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

Q&A

解決済

1回答

1527閲覧

ボタンを押しても処理されない

miyabi04

総合スコア5

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2020/04/18 16:48

前提・実現したいこと

python3のGUIでボタンを押すと事前に参照していたファイルの拡張子を変更するような機能をつけたいと思っています。

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

拡張子変更用のボタンを押しても関数が適用できないようです。
(ファイル名が取得できていない?)

該当のソースコード

import tkinter
from tkinter import *
from tkinter import ttk
from tkinter import filedialog
from tkinter import messagebox
import os
import pathlib
import shutil

def click_refer_button():
fTyp = [("","*")]
iDir = os.path.abspath(os.path.dirname(file))
filepath = filedialog.askopenfilename(filetypes = fTyp, initialdir = iDir)
file_path.set(filepath)
PATH = os.path.basename(filepath)

def click_export_button():
path = file_path.get()
if path[-4:] == '.txt':
f = open(path, encoding="utf-8")
text_data = f.read()
textBox.insert(END, text_data)
else:
textBox.insert(END, "\nファイルがtextファイルではありません")

def change_to_fasta(file_name, from_suffix, to_suffix):
sf = pathlib.PurePath(file_name).suffix#ファイルの拡張子を得る
if sf == from_suffix:# 変更対象かどうか判定する
st = pathlib.PurePath(file_name).stem# ファイル名(拡張子除く)を得る
to_name = st + to_suffix # 変更後のファイル名を得る
shutil.move(file_name, to_name)# ファイル名を変更する

if name == 'main':

root = tkinter.Tk() root.title("alignment") # アプリの名前 root.geometry("720x500") # アプリの画面サイズ frame1 = ttk.Frame(root, padding=10) frame1.grid() s = StringVar() s.set('ファイル名:') label1 = ttk.Label(frame1, textvariable=s) label1.grid(row=0, column=5) file_path = StringVar() filepath_entry = ttk.Entry(frame1, textvariable=file_path, width=50) filepath_entry.grid(row=0, column=5) refer_button = ttk.Button(frame1, text=u'参照', command=click_refer_button) refer_button.grid(row=0, column=2) frame2 = ttk.Frame(root, padding=10) frame2.grid() export_button = ttk.Button(frame2, text='ファイルの中身を出力', command=click_export_button, width=20) export_button.grid(row=0, column=5) textboxname = StringVar() textboxname.set('\n\n出力内容 ') label3 = ttk.Label(frame2, textvariable=textboxname) label3.grid(row=2, column=5) textBox = Text(frame2, width=100) textBox.grid(row=3, column=5) suffix_button = ttk.Button(frame2, text = "変更", command=change_to_fasta("PATH",".txt",".csv"), width = 20) suffix_button.grid(row=4, column=5) root.mainloop()

よろしくお願いいたします。

また、それに加えて、変更したファイルを対象に別の関数処理を加えたいのですがコードの記述方法をご教示くださると幸いです。
よろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teamikl

2020/04/19 00:33

Pythonのコードは、インデントや __file__ みたいな文字が正常に反映されない為、 コードの編集でお願いします。編集 -> <code>から編集可能です。
guest

回答1

0

ベストアンサー

diff

1- command=change_to_fasta("PATH",".txt",".csv"), width = 20) 2+ command=lambda:change_to_fasta(file_path.get(),".txt",".csv"), width = 20)

問題点は2点

  • command=に設定するタイミングでchange_to_fasta関数が呼ばれている。

関数を渡すところに、関数を呼び出した結果を渡しているので、
ボタンをクリックしたときにコードが呼び出されるようにします。

  • ファイル名が "PATH" 固定なので、ファイル名の変数を参照するようにします。

変更したファイルを対象に別の関数処理を加えたいのですがコードの記述方法をご教示くださると幸いです。

ここは、具体的なことが解らないので、どのような処理を想定されているのか解りませんが、
to_name が変更後のファイルなので、ファイル名変更が成功すれば、
通常のファイルと同じように扱えます。

注意点は、change_to_fasta 関数は
マウス・キーボード入力や描画等の処理をするmainloopから呼ばれる為、
ここで何か重たい処理をするとGUIのレスポンスに影響します。(ウィンドウが固まる状態)

その為、巨大なファイルが対象で時間のかかる場合は、
別スレッドにする等の対策が必要です。

投稿2020/04/19 00:31

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi04

2020/04/19 05:12

回答ありがとうございます! これでうまく動きました! また、注意事項も教えてくださりありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問