2010-09-17 16 views
12

tôi đang làm việc trên một hệ thống tin nhắn đơn giản, và cần phải thêm dòng sau vào một văn bản phụ tùng Tkinter:Thêm tính năng tiên tiến để một Tkinter Tiêu đề phụ tùng

  1. Spell Check
  2. Tùy chọn để thay đổi font (trên chọn văn bản)
  3. Lựa chọn để thay đổi màu chữ (trên văn bản đã chọn)
  4. Lựa chọn để thay đổi Font Size (trên văn bản đã chọn)

tôi under và tiện ích văn bản tkinter có khả năng sử dụng nhiều phông chữ và màu sắc thông qua cơ chế gắn thẻ, nhưng tôi không hiểu cách sử dụng các khả năng đó.

Làm cách nào để triển khai các tính năng đó bằng các tính năng của tiện ích Văn bản? Cụ thể, làm cách nào tôi có thể thay đổi họ phông chữ, màu sắc và kích thước của từ và cách tôi có thể sử dụng để thực hiện một cái gì đó như kiểm tra chính tả, nơi các từ sai chính tả được gạch dưới hoặc tô màu khác với phần còn lại của văn bản.

+0

Câu hỏi bây giờ dường như không yêu cầu nguồn cấp dữ liệu, thay vì thực hiện như tất cả các câu hỏi khác về SO cũng có. – Trilarion

+5

Tôi bị bối rối bởi việc đóng cửa do không có chủ đề. Đây không phải là yêu cầu để giúp tìm một nguồn tài nguyên hoặc công cụ cho mỗi se, nó hỏi làm thế nào một cái gì đó có thể được thực hiện. Phải thừa nhận rằng nó hơi rộng, nhưng câu trả lời được chấp nhận không liên quan đến các công cụ hoặc thư viện bên ngoài, nó chỉ mô tả cách sử dụng các tính năng hiện có. Tôi nghĩ câu hỏi này xứng đáng được mở lại. –

Trả lời

25

Tiện ích văn bản Tkinter là mạnh mẽ đáng kể, nhưng bạn phải tự mình thực hiện một số tính năng nâng cao. Nó không có kiểm tra chính tả tích hợp hoặc các nút dựng sẵn cho văn bản bolding, vv, nhưng chúng khá dễ thực hiện. Tất cả các khả năng đều có trong tiện ích, bạn chỉ cần biết cách thực hiện.

Ví dụ sau cung cấp cho bạn nút để chuyển trạng thái in đậm của văn bản được đánh dấu - chọn một dải ký tự, sau đó nhấp vào nút để thêm rồi xóa thuộc tính in đậm. Nó sẽ được khá dễ dàng cho bạn để mở rộng ví dụ này cho phông chữ và màu sắc.

Kiểm tra chính tả cũng khá dễ dàng. ví dụ sau sử dụng các từ trong/usr/share/dict/words (hầu như chắc chắn không tồn tại trên Windows 7, vì vậy bạn sẽ cần phải cung cấp một danh sách các từ thích hợp) Nó khá đơn giản ở chỗ nó chỉ kiểm tra chính tả khi bạn nhấn phím cách, nhưng đó chỉ là để giữ kích thước mã của ví dụ ở mức tối thiểu. Trong thế giới thực, bạn sẽ muốn thông minh hơn một chút khi bạn kiểm tra chính tả.

import Tkinter as tk 
import tkFont 

class App(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 

     ## Toolbar 
     self.toolbar = tk.Frame() 
     self.bold = tk.Button(name="toolbar", text="bold", 
           borderwidth=1, command=self.OnBold,) 
     self.bold.pack(in_=self.toolbar, side="left") 

     ## Main part of the GUI 
     # I'll use a frame to contain the widget and 
     # scrollbar; it looks a little nicer that way... 
     text_frame = tk.Frame(borderwidth=1, relief="sunken") 
     self.text = tk.Text(wrap="word", background="white", 
          borderwidth=0, highlightthickness=0) 
     self.vsb = tk.Scrollbar(orient="vertical", borderwidth=1, 
           command=self.text.yview) 
     self.text.configure(yscrollcommand=self.vsb.set) 
     self.vsb.pack(in_=text_frame,side="right", fill="y", expand=False) 
     self.text.pack(in_=text_frame, side="left", fill="both", expand=True) 
     self.toolbar.pack(side="top", fill="x") 
     text_frame.pack(side="bottom", fill="both", expand=True) 

     # clone the text widget font and use it as a basis for some 
     # tags 
     bold_font = tkFont.Font(self.text, self.text.cget("font")) 
     bold_font.configure(weight="bold") 
     self.text.tag_configure("bold", font=bold_font) 
     self.text.tag_configure("misspelled", foreground="red", underline=True) 

     # set up a binding to do simple spell check. This merely 
     # checks the previous word when you type a space. For production 
     # use you'll need to be a bit more intelligent about when 
     # to do it. 
     self.text.bind("<space>", self.Spellcheck) 

     # initialize the spell checking dictionary. YMMV. 
     self._words=open("/usr/share/dict/words").read().split("\n") 

    def Spellcheck(self, event): 
     '''Spellcheck the word preceeding the insertion point''' 
     index = self.text.search(r'\s', "insert", backwards=True, regexp=True) 
     if index == "": 
      index ="1.0" 
     else: 
      index = self.text.index("%s+1c" % index) 
     word = self.text.get(index, "insert") 
     if word in self._words: 
      self.text.tag_remove("misspelled", index, "%s+%dc" % (index, len(word))) 
     else: 
      self.text.tag_add("misspelled", index, "%s+%dc" % (index, len(word))) 


    def OnBold(self): 
     '''Toggle the bold state of the selected text''' 

     # toggle the bold state based on the first character 
     # in the selected range. If bold, unbold it. If not 
     # bold, bold it. 
     current_tags = self.text.tag_names("sel.first") 
     if "bold" in current_tags: 
      # first char is bold, so unbold the range 
      self.text.tag_remove("bold", "sel.first", "sel.last") 
     else: 
      # first char is normal, so bold the whole selection 
      self.text.tag_add("bold", "sel.first", "sel.last") 

if __name__ == "__main__": 
    app=App() 
    app.mainloop() 
+0

WOW! Đây là những gì tôi đang tìm kiếm! Cảm ơn! Đã không thực sự nhận ra nó dễ dàng như thế nào! +1 cho bạn! –

+0

Tôi tiếp tục nhận được thông báo lỗi ("sel.first") là chỉ mục không hợp lệ. Làm thế nào để sửa lỗi này? –

+0

Xin lỗi, đó chỉ là lỗi đánh máy, nhưng tôi không cài đặt chữ in đậm vì lý do nào đó. –

4

1) Tk không có trình kiểm tra chính tả tích hợp. Bạn có thể quan tâm PyEnchant.

2) 3) 4) không phải là khó khăn (xin vui lòng quên đề nghị trước đây của tôi để sử dụng wxPython). Bạn có thể chuyển tag_config như là arg thứ 3 của phương thức chèn của tiện ích văn bản. Nó định nghĩa cấu hình của lựa chọn này.

Xem mã sau được điều chỉnh từ ví dụ Scrolledtext và effbot có tham chiếu tốt nhất về Tk.

""" 
Some text 
hello 
""" 

from Tkinter import * 
from Tkconstants import RIGHT, LEFT, Y, BOTH 
from tkFont import Font 
from ScrolledText import ScrolledText 

def example(): 
    import __main__ 
    from Tkconstants import END 

    stext = ScrolledText(bg='white', height=10) 
    stext.insert(END, __main__.__doc__) 

    f = Font(family="times", size=30, weight="bold") 
    stext.tag_config("font", font=f) 

    stext.insert(END, "Hello", "font") 
    stext.pack(fill=BOTH, side=LEFT, expand=True) 
    stext.focus_set() 
    stext.mainloop() 

if __name__ == "__main__": 
    example() 
+0

Ok, tôi đang mở để sử dụng wxPython. Có bất kỳ ý tưởng làm thế nào điều này sẽ được thực hiện trong wx? –

+0

Quên đề xuất wxPython của tôi. Tôi đã tìm thấy một giải pháp Tk nhờ effbot. Tôi hy vọng nó sẽ giúp. Tốt nhất là – luc

+0

Ngoài việc thêm thẻ trong khi chèn, bạn cũng có thể thêm chúng vào thời gian chạy với tag_add.Vì vậy, ví dụ: bạn có thể nhận được phạm vi ký tự do người dùng chọn và áp dụng thẻ hoặc thẻ cho phạm vi văn bản đó. –

Các vấn đề liên quan