2013年9月30日月曜日

アメリカ高校交換留学の覚書

ぼくは高校二年の夏にアメリカへ1年間の交換留学にいった。
場所はミシガン州のRoyal Oak
特にこれといって特徴のない町。

現地のアメリカ人の家にホームステイして、高校は現地の公立高校へ通った。

あれから十年くらい経って今更感はあるけど、何があったのかをつづっていく。
不定期で順不同思いついた順番に書いていく。

続く。

2013年9月25日水曜日

PyQt QTableWidget: Copy and Past Excel interface

I made some copy and paste interface between QTableWidget and Excel sheet (only text).

The clipboard interface in PyQt4 can be acquired by
clip = QtGui.QApplication.clipboard()
clip.setText("hoge")
text = clip.text()

In QTableWidget, text in a cell can be acquired by
item(r,c).text()
this returns Qstring and has to be converted to str if you want.

A text can be set to a cell by
setItem(row, column, QtGui.QTableWidgetItem(text))


In Excel, copied cells are splitted by '\t' for columns and '\n' for rows.
The whole program gets like below.
Only the first selected range can be recognized in this example.
The error handling can be better.

Anyways, I hope this helps.

from PyQt4 import QtGui, QtCore
import sys

class MainWindow(QtGui.QMainWindow):
	def __init__(self):
		super(MainWindow, self).__init__()
		self.table = QtGui.QTableWidget(10,5)
		self.clip = QtGui.QApplication.clipboard()

		self.setCentralWidget(self.table)
		self.move(30,30)

	def keyPressEvent(self, e):
		if (e.modifiers() & QtCore.Qt.ControlModifier):
			selected = self.table.selectedRanges()
				
			if e.key() == QtCore.Qt.Key_V:#past
				first_row = selected[0].topRow()
				first_col = selected[0].leftColumn()
				
				#copied text is split by '\n' and '\t' to paste to the cells
				for r, row in enumerate(self.clip.text().split('\n')):
					for c, text in enumerate(row.split('\t')):
						self.table.setItem(first_row+r, first_col+c, QtGui.QTableWidgetItem(text))

			elif e.key() == QtCore.Qt.Key_C: #copy
				s = ""
				for r in xrange(selected[0].topRow(),selected[0].bottomRow()+1):
					for c in xrange(selected[0].leftColumn(),selected[0].rightColumn()+1):
						try:
							s += str(self.table.item(r,c).text()) + "\t"
						except AttributeError:
							s += "\t"
					s = s[:-1] + "\n" #eliminate last '\t'
				self.clip.setText(s)

def main(args):
    app = QtGui.QApplication(sys.argv)
    form = MainWindow()
    form.show()
    
    sys.exit(app.exec_())

    
    
if __name__ == "__main__":
    main(sys.argv)





PyQtの勉強をしてみる。その9 ダイアログを開いてファイル名を取得する。

久しぶりにPyQtを触ってみる。
QtGui.QFileDialog.getOpenFileName()を使ってダイアログを開いてファイル名を取得する。
ボタンをクリックしたらファイル名を取得して表示するようにした。


from PyQt4 import QtGui
import sys, os

class MyWidget(QtGui.QWidget):
 def __init__(self):
  super(MyWidget, self).__init__()
  self.button = QtGui.QPushButton("click me!")
  self.button.clicked.connect(self.open_FileDialog)
  self.ledit = QtGui.QLineEdit("") 

  hbox = QtGui.QHBoxLayout()
  hbox.addWidget(self.button) 
  hbox.addWidget(self.ledit)
  self.setLayout(hbox)

  self.move(50,50)

 def open_FileDialog(self):
  filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file', os.path.expanduser('~') + '/Desktop')
  self.ledit.setText(filename)

def main(args):
    app = QtGui.QApplication(sys.argv)
    form = MyWidget()
    form.show()
    
    sys.exit(app.exec_())
    
if __name__ == "__main__":
    main(sys.argv)