GUI iletişim kutusuna sahip kullanıcılardan komut satırı aracılığıyla dosya / dizin yolunu seçmelerini nasıl isteyebilirim?


16

Diyelim ki böyle bir senaryom var:

(Örnekte bir rysnc kullanım durumu gösterilmektedir)

#!/bin/bash
echo -n "Enter Source Directory:"
read srcdir
echo -n "Enter Destination Directory:"
read dstdir
rsync -av --delete "$srcdir" "$dstdir"

Buradaki fikir, kullanıcıdan rsync'in çalışması için "Kaynak" ve "Hedef" dizinlerini girmesini istemektir. Olduğu gibi, kullanıcının komut satırı üzerinden manuel olarak girmesi gerekecektir /path/to/directory/.

Bunun yerine , kullanıcıdan bir GUI arabirimi aracılığıyla yolları girmesini istemek istiyorum .

Bunun gibi bir şey: screem


Kullanıcıya komut satırına dosya yolunu döndüren bir GUI seçim penceresini sormak için hangi komutları kullanabilirim ?



4
Lütfen GUI pencerelerinin kullanımı hakkında uyarı eklemeyi unutmayın. Gereksiz pencereler, gelişmiş kullanıcılarda öfke uyandırabilir.
nperson325681

5
Neden, neden böyle sinir bozucu bir "özellik" uygulamak istesin ki? Komut satırına dizinleri girersek, sekme tamamlamayı kullanabileceğimizi ve bazı gui'lerin yüklenmesini beklememiz gerekmediğini unutmayın. Neden herkes mükemmel bir kabuk betiğine GUI eklemek isteyecek?
terdon

1
Paradigmaları karıştırdığımızdan, kullanıcının neden bir web uygulaması aracılığıyla yolları girmesine izin vermiyoruz?
Tulains Córdova

4
@terdon Eğer komut dosyasını doğrudan çalıştırırsak ve terminalde çalıştırmazsak GUI penceresi sağlamak istiyorum.
Pandya

Yanıtlar:


34

Bunu dosyalar için kullanabilirsiniz:

zenity --file-selection

ve bu klasörler için:

zenity --file-selection --directory

kullanım için, çalıştırın:

zenity --help-general
zenity --help-file-selection

Genellikle mevcut temayla (yine de GTK pencere yöneticileri için) eşleşir, makinemde Zukitwo 3.8'in modifiye edilmiş bir sürümüyle şu şekilde görünür:

Bunu kullanmanın bir yolu şöyledir:

echo "you selected $(zenity --file-selection)"

Hangi sonuçlanır you selected /path/to/file.

Ayrıca uygun bir başlık ve içinde başladığı dizini ayarlamak için seçenekleri kullanabilirsiniz - rsync kullanım durumunuzla, örneğin:

zenity --file-selection --directory --title="Choose rsync source directory" --filename=$HOME/Desktop/

Dosyalar için ayrıca seçmek için bir dosya türü belirtebilirsiniz - örn:

zenity --file-selection --file-filter='PDF files (pdf) | *.pdf' --title="Select a PDF file"

NOT: Ayrıca kullanabilirsiniz YAD , yükleri daha fazla özelliğe sahip Zenity bir çatal.

sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad

Kaynak

Çoğunlukla aynı şekilde kullanabilirsiniz - dosya tarayıcısı için:

yad --file-selection

ve yardım sayfası için:

yad --help-all

O sırada (sürüm 26 civarında?), Yeni GTK 3.14+ arayüzüne (Zenity'ye sahipti) uyacak şekilde güncellenmemişti - daha fazla özelliğe sahip, ancak uyumluluğu kontrol edin (GTK +> = 2.16'da çalışması gereken belgelere dayanarak). 0


2
Yad , Zenity'nin çarpıcı bir şekilde geliştirilmiş çatalıydı ve Zenity projesi hareketsiz kaldığı için büyük ölçüde yerini aldı. Bunu görmek Zenity artık geri gelişiminde Gnome.org (Gnome3 sadece?) Olan ama hiçbir şekilde indir görüyorum.
DocSalvager

@DocSalvage - bu sayfa oldukça eski - bir sonraki sürümde '3.2' yazıyor - Oldukça eski bir Fedora 19 sisteminde 3.8 sürümü var (Gnome 3.8 ile - Gnome kabuğunun her sürümü için oldukça az sayıda gnome güncellendi ( bu yüzden muhtemelen 3.10 + 3.12 için güncellenmiştir)). En son 2005-2009 hata raporlarıyla da ilgileniyor. En yeni kararlı sürümü (3.8 tekrar) Ubuntu depolarından alabilirsiniz - Packages.ubuntu.com/trusty/zenity . Ayrıca burada Yad'ın derlenmiş sürümlerini de bulabilirsiniz .
Wilf

Yad oldukça iyi görünüyor - zenity'den daha fazla seçeneği var :)
Wilf

1
@Wilf Evet, yad steroidlerde Zenity'dir. Bununla kavradığınızda, çok esnek olduğu için sallanır. Ben bir dönüştürüyüm. Aşağıdaki OP soruya bir cevap verdim (buna dayanamadım, üzgünüm) btw.
Scooby-2

@ Scooby-2 cool cevaplamak için kurulum talimatları ekledi (böylece gelecekteki kullanıcıların yorum yapması gerekmiyor)
Wilf

19

Sadece kayıt dialogiçin Metin Tabanlı Kullanıcı Arabirimi (TUI) çözümü için kullanabilirsiniz.

Sözdizimi:

dialog --title "text" --fselect /path/to/dir height width

Misal:

FILE=$(dialog --stdout --title "Please choose a file" --fselect $HOME/ 14 48)
echo "${FILE} file chosen."

Çıktı şu şekilde olacaktır:

Misal

@Wilf tarafından işaret edildiği gibi, terminali doldurmak için $LINESve $COLUMNSdeğişkenlerini kullanabilirsiniz :

$(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))

1
Doğru alternatif çözüm olsa da, söz konusu gibi GUI penceresi sağlamaz !
Pandya

2
Biliyorum, ama bir başkası faydalı bulabilir. Herhangi bir karışıklığı önlemek için ekran görüntüsünü yayınladım.
kraxor

7
Ve adil olmak gerekirse, GUI IMHO olarak nitelendirilir.
kraxor

3
GUI'ler ve TUI'lar (metinsel UI) arasında yaygın olarak kullanılan çizgi "atom" un boyutudur: bir piksel mi yoksa bir karakter mi?
nperson325681

3
Güzel cevap - bazı terminallerin genişliği ve yüksekliği $LINESve $COLUMNS- gibi değişkenlerle tanımlanır, böylece $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))terminal / ekran penceresini doldurmak için çalışırsınız .
Wilf

5

Bunun 8 aylık olduğunu ve OP'nin sorusunun da yanıtlandığını biliyorum. Ancak, yad'dan bahsedilmiş ancak herhangi bir örnek sunulmamıştır. İşte yad kullanan çözümüm.

DIR="/home" \
i=0;for location in source destination
do
((i++));selection[$i]=$(yad --center \
--width 350 \
--form \
--title="yad example" \
--text="Select $location directory" \
--field=:LBL "" \
--field=Path:DIR "$DIR" \
--separator='' )
done;\
echo "Command to run is \"rsync -av --delete ${selection[1]} ${selection[2]}\""

Çalışma şekli şöyledir. Biz değişken ayarlama, döngü için Yad koymak $locationiçin sourceilk geçiş için ve destinationsaniye. Çıktı, selection[]değişkenin iindeks olarak kullanıldığı diziye yerleştirilir . Bu başlangıçta 0 olarak ayarlanır ve her geçişte artırılır. Böylece kaynak ${selection[1]}ve hedef olarak kaydedilir ${selection[2]}.

İlk satırdaki DIR = "/ home" iletişim kutusunu varsayılan olarak ayarlar. Yad komut seçenekleri terminalden yazılarak bulunabilir yad --help.

yad ekran görüntüsü


2

Yanıtın en kısa (ve en iyi) çözümü: Yadtıpkı olduğu gibi tam seçeneği sunar zenity:

yad --file-selection --directory

Bu bir dizin seçimi iletişim kutusu açar. Ek argüman olmadan, --directorybunun yerine bir dosya seçimi iletişim kutusu olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.